为什么我的ListView不显示"列表"或者"详细信息"项目?

时间:2020-03-06 15:02:16  来源:igfitidea点击:

使用C.NET 2.0,我有一个所有者绘制的ListView,在其中重写OnDrawColumnHeader,OnDrawItem和OnDrawSubitem事件。如果在设计时将"视图"属性设置为"详细信息",则一切工作正常,并且可以切换"视图"属性,并且所有视图模式均应按其原样显示(我不使用平铺视图)。但是,如果我从其他任何视图开始,则"列表"和"详细信息"视图均为空白。

我知道我们可能想看一下代码,但是代码很多,所以我很犹豫地发布了很多代码,但是如果需要的话,可以发布。我更想知道是否有人以前看过这个,并且/或者可能对如何解决这个问题有所了解。 View属性将是用户保存的设置,因此默认情况下,我将无法始终在"详细信息"视图中启动。

解决方案

没有添加子项目,或者我们没有添加任何列。那是我的初衷。

如果使用设计器正确配置了它,只需进入生成的设计器代码,然后查看Visual Studio发出了什么代码即可使其正常工作。只需模拟该代码即可。

对于代码,没什么可说的,但是仅当OwnerDraw属性设置为true时才调用DrawColumnHeader。不确定是否根据View属性自动将其设置为true和false,但是值得尝试一下。因此,在启动应用程序之前,请确保将OwnerDraw设置为true。

WinForms ListView主要是实际Windows控件顶部的抽象层,因此,其行为的某些方面很违反直觉,这是一种礼貌的放置方式。

回忆起我作为Delphi开发人员的那段时光,我回想起当我们是所有者绘制ListView时,控件的子项实际上不会填充的除非我们在加载项目时Listview处于"详细信息"模式。

尝试的事情...

...更改显示样式后,强制WinForms控件重新创建基础的Windows句柄。如果有内存,DestroyHandle()是我们想要的方法。

...假设应用程序中有一个"刷新"来重新加载数据,那么在更改显示样式后刷新时,事情是否正常运行?

...如果所有其他方法都失败了,请在Windows编程中借用或者窃取Charles'Petzolds经典著作的副本。