2011-07-29 26 views
4

当我将项目添加到CheckedListBox列表框时,我还想要存储对另一个对象的引用。我试着将这个对象的一个​​新实例添加到CheckedListBox。使用自定义对象(CheckedListBox).Items.Add()

public class CheckedListBoxExtention : CheckedListBox 
{ 
    private ReferenceItem _referenceItem; 
    public ReferenceItem storedItem 
    { 
     get { return _referenceItem; } 
     set { _referenceItem = value; } 
    } 
    public CheckedListBoxExtention(ReferenceItem storedItem) 
    { 
     _referenceItem = storedItem; 
    } 
} 

这工作在后来当我foreach虽然在CheckedListBox中的项目我有_referenceItem对象的引用。但是,当我添加这样的项目时,CheckedListBox显示为空白(GUI本身中的列表)。所以我试图找到一种方法来覆盖项目文本或类似的东西。


这是我用来解决我有点新包装问题

class ReferenceItemWrapper 
{ 
    private ReferenceItem _item; 
    public ReferenceItemWrapper(ReferenceItem item) 
    { 
     _item = item; 
    } 
    public ReferenceItem getItem 
    {get {return _item;}} 
    public override string ToString() 
    { 
     return _item.ToString(); 
    } 
} 

的代码。为什么它在包装完成后无法正常工作?当我将ReferenceItem直接添加到CheckedListBox中时?

+0

请不要使用“C#”开始您的主题行 - 这就是我们在[SO]标记的内容。 –

+0

您是否想将CheckedListBox中的复选框替换为其他类型的控件,或者您只想将每个复选框与不同的对象关联起来? –

回答

4

CheckedListBox使用列表中对象的ToString方法来填充框中的标题。而不是扩展CheckedListBox,只需创建一个包装类,让您存储引用和标题,并实现返回标题的ToString方法。只需创建一个包装对象,将其中的文本粘在其中,将引用放入其中,然后将包装对象添加到列表框中。

+0

我没有使用包装,所以我读了他们一些,并试图实现它,它的工作。谢谢! –

+0

看着你的更新显示你如何解决问题,我不太确定为什么这样做是我的方式有所作为。在上下文中,我使用了这个技巧,我存储的项目没有实现一个合适的ToString,并且添加一个ToString是不可行的,所以我的包装器有一个单独的属性供文本返回。在你的情况下,如果对象已经有了合适的ToString,只需将它添加到列表框应该没有任何额外的努力工作。 – Thomee