如何在组合框中添加2列?

时间:2012-06-09 14:35:39

标签: c# winforms ado.net combobox

我认为在combobox中显示列是在Desingner of Form中的这个字符串:

this.ComboBox1.DisplayMember = "name";

但是,我无法在“名称”附近添加任何内容,组合框显示在所有字符串中:System.Data.DataRowView

也许是错的,请告诉我这是怎么回事?

我只是从数据源中将组合框作为组合框拖动:

表单加载时:

private void frmCheck_Load(object sender, EventArgs e)
{        
 this.ttzTableAdapter.Fill(this.dbDataSet.ttz, Convert.ToInt32(idFromWork.Text));
}

所以组合框显示,只是列表中的“名称”,我希望他在列表中显示“数字”和“名称”。

"Convert.ToInt32(idFromWork.Text)" 
显示名称的

参数,其中id_ttz(ID)= @idwork

4 个答案:

答案 0 :(得分:2)

DisplayMembera string specifying the name of an object property,它包含在DataSource属性指定的集合中。您无法指定要显示的多个属性。如果您尝试这样做,将无法找到您的“复合属性”,并且将通过ToString()实现显示对象(这就是您看到System.Data.DataRowView字符串的原因)。

如果需要显示对象的多个属性,可以create custom multi-column combobox并将其弹出为ListView或DataGridView。

UPDATE:您可以创建自己的匿名类型,而不是直接绑定到DataView的DataTable,它将提供用于显示的格式化文本:

ComboBox1.DataSource = tdbDataSet.ttz.AsEnumerable()
          .Select(row => new 
               { 
                 Text = String.Format("{0,5} | {1}", row["id_ttz"], row["name"]),
                 Value = row["id_ttz"]
               })
         .ToList();

ComboBox1.DisplayMember = "Text";
ComboBox1.ValueMember = "Value";

答案 1 :(得分:2)

您无法在组合框中添加两列。怎么能从两个对象中连接值。请参阅此WinForms combobox with multiple columns (C#)?

答案 2 :(得分:1)

在您的查询中添加计算列

  select name, ..., name+' '+number as colToDisplay...

并像这样使用

   this.ComboBox1.DisplayMember = "colToDisplay";

或者,如果您将组合绑定到custom object

添加一个新属性,该属性组合了您需要显示的列

 public string PropertyToShow
 {
   get{return name+" "+otherProp;}
 } 

答案 3 :(得分:0)

你有几种可能性。如果未指定DisplayMember,则组合框使用ToString方法获取字符串。因此,如果您控制了类的ToString方法,则可以自然地覆盖类的DisplayMember方法。或者您可以添加一个返回适当字符串的属性,并在ComboBox中使用它。

完全不同的方法是通过从DrawMode派生一个来创建自己的组合框。如果项目的高度相同,则将组合框的OwnerDrawFixed更改为OwnerDrawVariable;如果项目高度不同,则将OnDrawItem更改为OwnerDrawVariable。您必须覆盖OnMeasureItem并执行自己的绘图逻辑。如果您指定了{{1}},则必须覆盖{{1}}以告知每个项目的组合框高度。

使用第二种方法可以创建真实的列并绘制垂直分隔符等等。您可以使用不同的背景和文字颜色,不同的字体等绘制图标。