我有一个组合框,但我希望它能从数据源中显示两个不同的列值。
所以不要简单地用“rowid”(可能的值“1”,“2”,“3”等)填充它,我希望它显示“字母”(“a”,“b”,“c “)列也是,但在同一个框中。
它发送的实际值只能是rowid值,但出于用户友好的目的,我需要两者。
this.comboBox1.DataSource = this.tblIDSourceBindingSource;
this.comboBox1.DisplayMember = "rowid";
this.comboBox1.FormattingEnabled = true;
this.comboBox1.Name = "comboBox1";
this.comboBox1.ValueMember = "rowid";
正如您所看到的,它正在显示“rowid”。试图告诉它显示“字母”另外抛出一切。
答案 0 :(得分:3)
您需要覆盖Format事件
// FormatString property is shown in the designer, so you can provide
// some designer support. If you are not using the desinger then you
// either set it in the form/control ctor, or use a string directly
// in the Format event.
ListControl.FormatString = "{0}/{1}" ;
private void listBoxCategory_Format(object sender, ListControlConvertEventArgs e)
{
e.Value = string.Format(((ListBox)sender).FormatString,
((ClassOfListItem)e.ListItem).LongName,
((ClassOfListItem)e.ListItem).Key);
}
答案 1 :(得分:2)
假设:你不能只显示“字母”并完成它。
将你的过程改为,而不是
select rowid, letter, blah
from table
做类似
的事情select rowid + ' ' + letter as display, rowid, letter, blah
from table
或者如果您不喜欢这个空格,请使用您选择的分隔符(管道,斜线,括号中的rowid等)。
然后使用“display”作为您的DisplayMember。
P.S。如果rowid是int,则需要使用CAST或CONVERT使其成为nvarchar或varchar。
p.p.s。如果你不能改变你的proc,那么漫长的方法是创建一个与你的返回相同的轻实体,但添加一个名为Display的只读属性,其get类似于
return string.Format("{0}{1}{2}", this.rowid, delimiterOfChoice, this.letter);
或那种性质的东西。
然后只使用这些实体的集合作为绑定源。
答案 2 :(得分:0)
作为一种快速而肮脏的黑客攻击,一旦从数据库中填充新列,就应该能够为数据表添加新列。遍历表格,构建要为每行显示的字符串,并将其粘贴到新列中。然后绑定它以显示该值。
答案 3 :(得分:0)
您应该在您的类/页面中添加一个新属性,该属性获取数据源中两个字段的值,并将displaymember分配给此属性