【问题标题】:override a class/add properties to a ListviewItem (vb.net)覆盖类/将属性添加到 ListviewItem (vb.net)
【发布时间】:2010-01-12 21:53:21
【问题描述】:

我有一个列表视图,但我想在其中的列表视图项中添加 3 个属性(例如其中一个是“图像”)。
我可以创建一个具有 3 个属性的自定义类并仅继承 ListViewItem,但现在我需要使用 MultiSelect,所以这意味着执行以下操作(在 For Each 循环中):

ListView1.SelectedItems.Item(i).Image
不起作用,因为它返回 ListViewItem 而不是我的 CustomClass。
我总是可以做到的:
Ctype(ListView1.selectedItems(i), MyCustomClass).Image

但是一遍又一遍地使用它似乎是一种浪费/错误的做法?

【问题讨论】:

  • 不,这是正确的做法。如果升级 Windows 窗体以支持泛型,那就太好了,但它没有发生。

标签: .net vb.net properties overriding


【解决方案1】:

这就是它的工作原理。 ListView 可以存储任何类型的 ListItem 并且要获取派生演员表的属性,您必须对其进行转换。你做得对。

【讨论】:

    【解决方案2】:

    子类ListViewItem 只是为了附加自定义属性并不是一个特别好的主意。该类专门为此目的提供了Tag property,您应该使用自己的对象而不是子类来填充它。从语法上讲,它可能不会有很大的不同,但它是一个更好的设计。

    【讨论】:

    • 但只有 1 个标签,我需要一个图像属性、一个 CustomClass 和一个字符串。
    • 那么您应该将一个包含三个属性的自定义类的实例附加到ListViewItem 实例的Tag 属性。
    • 但是如果我使用标签然后执行 ListviewItem.tag.Image 它不会在智能感知中显示(这就是当您键入句号时调用的框对吗?)表明这不是正确的方法去做。
    • 当然。 Tag 属性的类型是 Object,因为它被设计为能够容纳 any 实例。当您想使用它时,您必须将 Tag 属性转换回您分配给它的类型(类似于您现在对列表视图项本身所做的事情;正如我所说,它不会有太大的不同语法-明智的)。然而,关键是,在大多数情况下,应该避免继承而支持组合。事实上,Tag 属性是专门设计来消除像您这样的情况的继承需求。
    • 好吧,我发现使用 Tag 对象一直有效,直到我需要访问它所属的 Listviewitem(并且我通过创建父属性进行 cba)所以我将使用继承
    猜你喜欢
    • 1970-01-01
    • 2011-08-28
    • 2016-05-21
    • 2013-04-05
    • 1970-01-01
    • 2021-11-06
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多