ComboBox
をDataTable
にバインドしたい(元のスキーマを変更できない)
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";
計算されたカラムソリューションはおそらく最良のものです。ただし、データテーブルのスキーマを変更してそれを追加できない場合は、テーブルをループして、データソースとして機能する新しいコレクションを作成できます。
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に直接バインドするほどパフォーマンスは良くありませんが、テーブルに数千の行がない限り、心配する必要はありません。
最も簡単な方法は、Expressionプロパティを使用して、DataTableに新しい計算列を作成することです。
tbldata.Columns.Add("FullName", typeof(string), "Name + ' ' + Surname");
...
cbo.DataTextField = "FullName";
私はあなたのデータオブジェクトにプロパティを作成し、それをDataTextFieldにマッピングします
データオブジェクト
public string FullName
{
get { return Name + " " + Surname; }
}
分離コード
cbo.DataSource = tbldata;
cbo.DataTextField = "FullName";
cbo.DataValueField = "GUID";
cbo.DataBind();
または、次のように「Format」イベントを実装します。
DataRow r = ((DataRowView)e.ListItem).Row;
e.Value = r[ "FirstName" ] + " - " + r[ "LastName" ];
NameとSurnameを連結したプロパティをクラスに入れます。そして、DataTextFieldをこのプロパティにバインドします。
これをDataTableにバインドしている場合は、値がNameとSurnameの連結であるDataTableに新しい列を追加して、コンボにバインドできます。
DataColumnの Expression プロパティを使用して計算された列を確認します。
コンボバインディングイベントを登録してアイテムを反復処理し、コンボボックスアイテムのデータアイテムを使用して、各アイテムのテキストを目的のフィールドに設定できます。