web-dev-qa-db-ja.com

ComboBoxをバインドして、displaymemberがソースデータテーブルの2つのフィールドを連結する方法を教えてください。

ComboBoxDataTableにバインドしたい(元のスキーマを変更できない)

cbo.DataSource = tbldata;
cbo.DataTextField = "Name";
cbo.DataValueField = "GUID";
cbo.DataBind();

ComboBoxショーtbldata.Name + tbldata.Surname

もちろん、バインディングの直前にtbldataにフィールドとして新しいname + surnameを追加することは可能ですが、(pseudocode)の行に沿ってよりエレガントな解決策を望んでいます

cbo.DataTextField = "Name";
cbo.DataTextField += "Surname";
25
callisto

計算されたカラムソリューションはおそらく最良のものです。ただし、データテーブルのスキーマを変更してそれを追加できない場合は、テーブルをループして、データソースとして機能する新しいコレクションを作成できます。

var dict = new Dictionary<Guid, string>();
foreach (DataRow row in dt.Rows)
{
    dict.Add(row["GUID"], row["Name"] + " " + row["Surname"]);
}
cbo.DataSource = dict;
cbo.DataTextField = "Value";
cbo.DataValueField = "Key";
cbo.DataBind();

明らかに、これはDataTableに直接バインドするほどパフォーマンスは良くありませんが、テーブルに数千の行がない限り、心配する必要はありません。

26
Jamie Ide

最も簡単な方法は、Expressionプロパティを使用して、DataTableに新しい計算列を作成することです。

tbldata.Columns.Add("FullName", typeof(string), "Name + ' ' + Surname");
...
cbo.DataTextField = "FullName";
19
Thomas Levesque

私はあなたのデータオブジェクトにプロパティを作成し、それをDataTextFieldにマッピングします

データオブジェクト

public string FullName
{
  get { return Name + " " + Surname; }
}

分離コード

cbo.DataSource = tbldata;
cbo.DataTextField = "FullName";
cbo.DataValueField = "GUID";
cbo.DataBind();
5
bendewey

または、次のように「Format」イベントを実装します。

DataRow r = ((DataRowView)e.ListItem).Row;
e.Value = r[ "FirstName" ] + " - " + r[ "LastName" ];
4
anaconda

NameとSurnameを連結したプロパティをクラスに入れます。そして、DataTextFieldをこのプロパティにバインドします。

これをDataTableにバインドしている場合は、値がNameとSurnameの連結であるDataTableに新しい列を追加して、コンボにバインドできます。

2
Rashmi Pandit

DataColumnの Expression プロパティを使用して計算された列を確認します。

1
Ajw

コンボバインディングイベントを登録してアイテムを反復処理し、コンボボックスアイテムのデータアイテムを使用して、各アイテムのテキストを目的のフィールドに設定できます。

0
Tamir