3

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

但是,我无法弄清楚如何在 c# 中做到这一点。我试图实现我自己的类:

public class Device  {
    String s;

    public Device() {
        s = new String("test".ToCharArray());

    }

    public String toString() {
        return s;
    }
}

但是当我运行它时,它会在列表中显示“WindowsFormsApplication2.Device”,而不是测试..

任何建议,将不胜感激。

谢谢,礼萨

ps 是否可以为复选框中的每个条目显示文本和进度条?

4

4 回答 4

5

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

  1. 方法名称拼写错误(C# 区分大小写)。
  2. override缺少方法上的修饰符;这是覆盖虚拟方法时所必需的。

这样做:

public override string ToString()
{
    return s;
}
于 2011-09-04T11:13:44.963 回答
1

让你的 toString 方法像这样:

public override string ToString(){
    return s;
}
于 2011-09-04T11:15:03.147 回答
1

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

public override String ToString() {
    return s;
}

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

于 2011-09-04T11:15:09.257 回答
0

你已经有了答案,但这是我喜欢使用的一个技巧。我不喜欢在模型上使用 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 一起存储,而不是与每个单独的项目一起存储。

于 2011-09-04T12:44:40.510 回答