2016-03-22 11 views
0

ここでは手作業でDataWowをthis.listBox1.Itemsに追加し、WinFormsデザイナーでDisplayMemberを列名に設定しましたが、後で表示されるのは型の名前(System.Data ...)のリストだけです。ListBoxで手動で追加したDataRowでDisplayMemberが動作しないのはなぜですか?

この問題を解決するにはどうすればよいですか?

CODE:

list1.ForEach(x => this.listBox1.Items.Add(x)); //x is DataRow from a filled DataTable 
+0

コードスニペットを共有できますか? – Munawar

+0

非常にシンプルなコードです。私は自分の質問を編集しました –

答えて

4

DisplayMemberValueMemberが適用されます。それらは、リフレクションによって取得できるリアルプロパティ、または.NETコンポーネントモデルとICustomTypeDescriptorインターフェイスを使用して動作します。

あなたは常にDataRowViewインスタンスの代わりに、DataRow Sを直接DataTableGetEnumerator方法とIList実装リターンをバインドする場合。 DataRowViewはが列名を参照できるICustomTypeDescriptorを実装しています。

カスタムフィルターリストを追加したい場合は、どのソースからでも作成することをおすすめします。例:

listBox1.DisplayMember = "Name"; 
listBox1.ValueMember = "Value"; 

var list = Enumerable.Range(1, 10).Select(i => new {Name = i.ToString(), Value = i}).ToList(); 
listBox1.DataSource = list; 

プロパティが存在する場合、その値が表示されます。そうでない場合は、項目のToStringが表示されます。

ただし、プログラムでアイテムを追加すると(ListBox.Items)、これらのプロパティは無視され、常にアイテムのToStringが使用されます。

+0

私はdatatable direclyをバインドしていません。各DataRowをListBoxに手動で挿入します。すべてのDataRowをListBoxに挿入する前に、DataTableがアダプタで埋められています。私は匿名型ではなくDataRowで作業したいです –

+0

なぜDataTableをバインドしないのですか?または、手動で項目を追加すると、なぜ文字列リストや適切な 'ToString'メソッドを持つカスタムタイプリストの代わりに' DataRow'リストを主張するのですか? 'DisplayMember'はデータバインディングにのみ適用できます。 – taffer

+0

私は手動で追加する必要があります。それはどういう意味ですか –

2

はあなたのリストボックスに追加したい列名を指定します:あなたは(ListBox.DataSource)のデータバインディングを使用する場合にのみ

list1.ForEach(x => this.listBox1.Items.Add(x["column_name"])); 
+1

list1.ForEach(x => this.listBox1.Items.Add(x ["GroupName"]));作品が選択されたアイテムは、その後、単純な文字列であり、グループIDなどの別の列を扱うためには完全な行が必要です。 –

+0

行を行単位で追加する必要がありますか?私は、リストボックスのバインディングがより明確で扱いやすくなると思う。 – Roman

+0

私はする必要があります。それはまさにそれです。 –

関連する問題