【问题标题】:Why doesn't my ListView display List or Details items?为什么我的 ListView 不显示 List 或 Details 项?
【发布时间】:2008-10-02 17:07:52
【问题描述】:
使用 C# .NET 2.0,我有一个所有者绘制的 ListView,我在其中覆盖了 OnDrawColumnHeader、OnDrawItem 和 OnDrawSubitem 事件。如果我在设计时将 View 属性设置为 Details,则一切正常,我可以切换 View 属性,并且所有视图模式都按应有的方式显示(我没有使用 Tile 视图)。但是,如果我从任何其他视图开始,列表和详细信息视图都是空白的。
我知道您可能想查看代码,但代码很多,所以我不太愿意发布这么多,但如有必要可以发布。我更好奇是否有人以前见过这个,和/或可能对如何修复它有所了解。 View 属性将是用户保存的设置,因此默认情况下我将无法始终从 Details 视图开始。
【问题讨论】:
标签:
c#
.net
winforms
listview
【解决方案1】:
要么没有添加子项,要么没有添加任何列。这是我最初的感觉。
【解决方案2】:
WinForms ListView 主要是实际 Windows 控件顶部的抽象层,因此其行为的某些方面,嗯,违反直觉是一种礼貌的表达方式。
我有一个模糊的回忆,从我作为 Delphi 开发人员的日子开始,当您作为所有者绘制 ListView 时,控件的子项实际上并没有填充,除非您的 Listview 在加载时处于“详细信息”模式物品。
要尝试的事情...
...在您更改显示样式后,强制 WinForms 控件重新创建基础窗口句柄。如果没记错的话,DestroyHandle() 就是你想要的方法。
...假设您的应用程序中有一个“刷新”来重新加载数据,那么在更改显示样式后刷新时是否可以正常工作?
...如果一切都失败了,求借或窃取 Charles 的 Petzolds 经典 Windows 编程副本。
【解决方案3】:
如果您使用设计器正确配置它,只需进入生成的设计器代码并查看 Visual Studio 发出的代码以使其正常工作。那么只需模拟该代码即可。
【解决方案4】:
没有你的代码,没什么可说的,但 DrawColumnHeader 只有在 OwnerDraw 属性设置为 true 时才会调用。不确定它是否会根据 View 属性自动设置为 true 和 false,但值得一试。因此,请确保在启动应用程序之前将 OwnerDraw 设置为 true。