web-dev-qa-db-ja.com

ComboBoxの新しい表示メンバーにバインドできません

このエラーが発生するクラスがあります

public class Item 
{
    public string Name;
    public int Id

    public Item(string name, int id) 
    {
        Name = name; 
        Id = id;
    }
}   

これが私の機能です

 var lstItems = new List<Item>();
 while(...)
 {
     lstItems.Add(new Item(sAd_Ref, Convert.ToInt32(sAd_ID))); 
 }

 comboBox1.DataSource = lstItems;
 comboBox1.ValueMember = "Id";
 comboBox1.DisplayMember = "Name";

最後の行の2番目に私は例外を得ています

新しい表示メンバーにバインドできません。

12
user3244721

NameおよびIdプロパティを作成する必要があります。 ComboBoxをフィールドにバインドすることはできません。

public string Name { get; set; }
public int Id { get; set; }

docs にも記載されています:

ValueMember Property:System.Windows.Forms.ListControl内のアイテムの実際の値として使用するpropertyを取得または設定します。

16
Selman Genç

投稿が古いことは知っていますが、受け入れられた回答は正しくありません。 Opは、displayMember、valueMember、およびDatasourceの割り当て方法の順序を変更してから、追加されたコード行をメモする必要がありました。

comboBox1.DisplayMember="Name";
comboBox1.ValueMember = "Id";
comboBox1.DataSource = lstItems;
comboBox1.BindingContext = this.BindingContext;
11
Ken

私の場合、Browsable属性がfalseに設定されているプロパティにバインドしました。

つまり次の理由でエラーが発生しました。

[Browsable(false)]
public string MyProperty { get; set; }

そして、属性を削除するだけで解決しました。

public string MyProperty { get; set; }
1
Uwe Keim

私の問題は、dataSourceがType List <string>であったため、それをテストするだけでした。

public static void AddDataSource<T>(this ComboBox comboBox, T dataSource, string item)
{
    comboBox.DataSource = dataSource;

    if (!typeof(T).Equals(typeof(List<string>))) // <-- Here
    {
        comboBox.DisplayMember = "Name";
        comboBox.ValueMember = "Value";
    }

    comboBox.SelectedIndex = -1;
    comboBox.Text = $"Select a {item}";
}
0
Demodave

私の場合、DataTableにバインドしていると思ったときに、DataSetにバインドしていました。

0
tsilb
if (lstItems.Count > 0)
{
    comboBox1.DataSource = lstItems;
    comboBox1.DisplayMember = "Name";
    comboBox1.ValueMember = "Id";
}
0
Poppy Field

tldr:バインドしているソースが空でないことを確認してください。

同じエラーメッセージが表示されていました

'新しい表示メンバーにバインドできません。パラメーター名:newDisplayMember'

次のようなコードから

bindingSource.DataSource = _MyDict;
comboBox.DisplayMember = "Value";
comboBox.ValueMember = "Key";

バインディングソースはすでにデザイナに接続されています。

ValueMemberプロパティを設定すると、コンボボックスはリフレクションを使用するリスト内のインスタンスを見つけようとします(おそらくプロパティが実際に存在することを確認するため)。ソースコレクションが現在空の場合、これは失敗します。

0
Dysnomian