c# CheckListBox -如何添加对象并让对象显示文本

本文关键字:对象 文本 显示 添加 CheckListBox 何添加 | 更新日期: 2023-09-27 18:07:22

我想有一些对象,可以添加到c#中的checkedListBox,并有对象能够生成自己的字符串,显示在列表中。我找到了一个我想在visual basic中做的例子。

然而,我不知道如何在c#中做到这一点。我已经尝试实现我自己的类:

public class Device  {
    String s;
    public Device() {
        s = new String("test".ToCharArray());
    }
    public String toString() {
        return s;
    }
}

但是当我运行它时,它显示"WindowsFormsApplication2"。

如有任何建议,不胜感激。

谢谢,Reza

注。是否有可能在复选框中为每个条目显示文本和进度条?

c# CheckListBox -如何添加对象并让对象显示文本

您没有正确地覆盖Object.ToString()虚拟方法:

  1. 方法名拼写错误(c#是区分大小写的)。
  2. 方法上缺少override修饰符;当重写虚方法时,是必需的

这样做:

public override string ToString()
{
    return s;
}

让你的toString方法像这样:

public override string ToString(){
    return s;
}

the_ajp正确地指出,真正的问题是camelCase toString,而应该是PascalCase ToString

public override String ToString() {
    return s;
}

另外,在编写c#代码时不要看Java示例,s = new String("test".ToCharArray());应该只是s = "test";

你已经有了答案,但这里有一个我喜欢使用的技巧。我不喜欢在模型上使用ToString()方法的一点是,它混合了业务逻辑和视图逻辑。

相反,我创建了一个包装器类(适配器设计模式),它保留了对模型对象的引用,并提供了自己的ToString方法。您可以将其与匿名函数结合使用,以指定如何准确地获得所显示的字符串(您可能希望在不同的列表框中显示略有不同的字符串)。

包装器类看起来像这样:

class ListBoxWrapper<T>
{
    private T obj;
    private Func<T, string> stringFunction;
    public ListBoxWrapper(T obj, Func<T, string> stringFunction)
    {
        this.obj = obj;
        this.stringFunction = stringFunction;
    }
    public override string ToString()
    {
        return stringFunction(obj);
    }
}
要简单地使用模型的ToString(),您仍然可以这样做:
ListBox.Items.Add(new ListBoxWrapper<Device>(device, dev => dev.ToString()));

但是你也可以这样做(例如):

ListBox.Items.Add(new ListBoxWrapper<Device>(device, dev => dev.SerialNumber.ToString()));

为了使它更有用,你可以创建你自己的类,派生自ListBox或CheckedListBox,它将自动包装你的对象。这样,您还可以将字符串函数存储在ListBox中,而不是存储在每个单独的项中。