我有以下代码,我试图用来填充ComboBox,但它没有显示我正在添加的对象的实际文本。
internal partial class SortBox : UserControl {
private Field[] FieldReferences
...
internal Field[] Fields {
...
set {
this.FieldReferences = value;
this.cboFields.Items.Clear();
string NoneString = "(none)";
this.cboFields.Items.Add(NoneString);
this.cboFields.SelectedItem = NoneString;
foreach (Field Field in this.FieldReferences) {
MessageBox.Show(Field.ToString()); // <- This displays what I want displayed perfectly.
this.cboFields.Items.Add(Field);
}
}
}
...
}
public partial class Field : UserControl {
protected string LabelValue;
...
public override string ToString() {
return this.LabelValue;
}
}
这是我得到的;他们都是空白的:
我做错了什么?
编辑:显然,我的Field类继承自UserControl。我做了一些测试,显然这与类继承System.ComponentModel.Component的事实有关。
答案 0 :(得分:1)
如果我正在阅读您的代码,那么您正试图将用户控件放在组合框中。
当你这样做时,覆盖ToString是行不通的,所以为了使你当前有效的代码,只需更改DrawMode:
这有效:
cboFields.DrawMode = DrawMode.OwnerDrawFixed;
cboFields.DrawItem += new DrawItemEventHandler(cboFields_DrawItem);
private void cboFields_DrawItem(object sender, DrawItemEventArgs e)
{
e.DrawBackground();
if (e.Index > -1)
e.Graphics.DrawString(cboFields.Items[e.Index].ToString(), e.Font, Brushes.Black, e.Bounds);
}
但我不得不说,我不知道将UserControl放在ComboBox集合中是否是最好的方法。我会认真考虑以不同的方式进行重构。
答案 1 :(得分:0)
您添加到组合框中的项目也应该是字符串,就像在消息框中一样。
尝试:this.cboFields.Items.Add(Field.ToString());
或者,您可以尝试设置DisplayMember字段,但ToString应该已经是默认值:
this.cboFields.DisplayMember = "ToString()"