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”
答案 0 :(得分:5)
在你控制中创建一个属性并将组合框的DisplayMember映射到该属性,它应该可以工作。
答案 1 :(得分:3)
我试图理解源代码(!)。这不是对ToString()
的简单调用。
有一个internal
班System.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
对我来说,这是一个非常干净的解决方案,直觉告诉我这是达到目的的方法。