【问题标题】:Overriding ToString() and adding to ListBox C#覆盖 ToString() 并添加到 ListBox C#
【发布时间】:2011-04-21 12:28:58
【问题描述】:

谁能解释一下:

public class Test : List<int>
{
    public override string ToString()
    {
        return "My ToString";
    }
}

如果我实例化它并将它添加到 Windows Form 上的 ListBox 控件,它会显示“Collection”而不是“My ToString”。

Test test = new Test();
listBox1.Items.Add(test);

我认为添加到Items 只会调用我班级的ToString()。当然,以下工作正常

MessageBox.Show(test.ToString());

【问题讨论】:

    标签: c# .net winforms generics tostring


    【解决方案1】:

    为此,您必须禁用格式化:

    listBox1.FormattingEnabled = false;
    

    看起来如果启用了格式化,它会做一些魔术,结果并不总是应该的......

    【讨论】:

    • 我无法相信列表框会这样工作。我花了很长时间才弄清楚谷歌的正确单词组合来找到这个问题来解决问题。糟糕的。不过答案很好。
    【解决方案2】:

    将 ListBox 上的 DisplayMember 设置为 Test 类型的属性。

    listBox1.DisplayMember = "Name";
    

    要解决您的问题,请将名为“Name”的属性添加到 Type 并在 getter 中调用 ToString。

    public class Test : List<Int32>
    {
        public String Name { get { return this.ToString(); } }
    
        public override string ToString()
        {
            return "Test";
        }
    }
    

    【讨论】:

    • 是的,我也知道...问题是为什么 Listbox.items.add callign 不是我覆盖的 toString()?
    【解决方案3】:

    是不是一定要这样:

    listBox1.Items.Add(test.ToString());
    

    我假设您希望您的列表框包含字符串类型?

    不确定是否正确,我还没有测试过。

    【讨论】:

    • 当然可以——但是 Add() 接收一个对象,它不只是调用虚拟的 Object.ToString() 吗?如果我将我的类更改为从 Object 继承,它可以工作......
    【解决方案4】:

    ListBox 中的项目是对象的集合,而不是字符串。

    MSDN: ListBox.ObjectCollection.Add Method

    因此,在查看必须调用 ToString 的列表框时,您必须在前端或后端将实例添加为字符串(例如:listBox1.Items.Add(test.ToString());)(例如:listBox1.Items[0].ToString();)。

    【讨论】:

    • 否 - 如果你是正确的,为什么将 int 添加到列表框有效?它调用 Object 中的虚拟 ToString() 方法。如果我将我的类更改为从 Object 继承,它也可以工作......
    【解决方案5】:

    我也遇到过这个(再次感谢 Manji!)。 我有这样的事情:

    public override string ToString()
        {
            return  MessageText;
        }
    

    MessageText 是其他几个文本字段中的一个,它运行良好。后来我改成了这个

    public override string ToString()
        {
            return string.Concat("[", MessageTime.ToString("yyyy-MM-dd HH:mm:ss.fffff"), "] ", MessageText);
        }
    

    它仍然会返回 MessageText 字段内容(拉头发的时间)。有趣的是,我设置为将所选项目复制到剪贴板的 ListBox 上的上下文菜单确实使用了完整的 ToString 覆盖。

    我个人认为 FormattingEnabled 属性应该默认为 false 而不是 true,我发现我经常被 IDE(或控制设置)试图变得聪明。

    ///编辑:错字(一定记得不要用肘部打字!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-06
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多