为什么重写ToString()时,当项目添加到ComboBox时,不返回我想要的内容?

时间:2013-04-08 18:00:22

标签: c# combobox override tostring

public partial class TestConrol : UserControl
{
    public TestConrol()
    {
        InitializeComponent();
    }

    public override string ToString()
    {
        return "asd";
    }
}

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        TestConrol tc1 = new TestConrol();
        comboBox1.Items.Add(tc1);

        TestConrol tc2 = new TestConrol();
        comboBox1.Items.Add(tc2);
    }
}

当表单加载时,我看到combobox有两个空名称的项目,而不是“asd”:/
但是如果我在公共类中重写ToString(),而不是从任何东西派生,那么这个工作:

public class TestClass
{
    public override string ToString()
    {
        return "bla bla bla";
    }
}

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        TestClass tcl = new TestClass();
        comboBox1.Items.Add(tcl);
    }
}

之后我在组合框中看到“bla bla bla”

5 个答案:

答案 0 :(得分:5)

在你控制中创建一个属性并将组合框的DisplayMember映射到该属性,它应该可以工作。

答案 1 :(得分:3)

我试图理解源代码(!)。这不是对ToString()的简单调用。

有一个internalSystem.Windows.Forms.Formatter在做一些事情。它最终创建了一个转换器。这大致相当于说:

var conv = System.ComponentModel.TypeDescriptor.GetConverter(tc1.GetType());

其中tc1是您问题中的TestContol。现在,如果我们使用了没有实现任何接口的TestClass tcl,这会给我们一个最终会调用ToString()的转换器。

但在此示例中,我们使用tc1,它是System.ComponentModel.IComponent。因此,conv成为System.ComponentModel.ComponentConverter。它使用Site的{​​{1}}。当我们说:

IComponent

并且string result = conv.ConvertTo(tc1, typeof(string)); 为null,我们得到您在组合框中看到的空字符串Site。如果有""它会使用Site代替。

为了证明这一点,请将以下内容放入Name实例构造函数中:

TestControl

其中public TestConrol() { InitializeComponent(); Site = new DummySite(); // note: Site is public, so you can also // write to it from outside the class. // It is also virtual, so you can override // its getter and setter. } 类似于:

DummySite

答案 2 :(得分:1)

使用comboBox1.Items.Add(tc1.ToString());代替comboBox1.Items.Add(tcl);

答案 3 :(得分:0)

这对我有用:

comboBox1.FormattingEnabled = false

答案 4 :(得分:0)

在您的UserControl中,添加一个属性,例如将其命名为FriendlyName

namespace project
{
   public partial class CustomUserControl : UserControl
   {
      public CustomUserControl()
      {
         InitializeComponent();
      }

      public String FriendlyName { get => "Custom name"; }
   }
}

然后将您的DisplayMember的{​​{1}}属性设置为“ FriendlyName”

ComboBox

对我来说,这是一个非常干净的解决方案,直觉告诉我这是达到目的的方法。