このエラーが発生するクラスがあります
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番目に私は例外を得ています
新しい表示メンバーにバインドできません。
Name
およびId
プロパティを作成する必要があります。 ComboBox
をフィールドにバインドすることはできません。
public string Name { get; set; }
public int Id { get; set; }
docs にも記載されています:
ValueMember Property
:System.Windows.Forms.ListControl内のアイテムの実際の値として使用するpropertyを取得または設定します。
投稿が古いことは知っていますが、受け入れられた回答は正しくありません。 Opは、displayMember、valueMember、およびDatasourceの割り当て方法の順序を変更してから、追加されたコード行をメモする必要がありました。
comboBox1.DisplayMember="Name";
comboBox1.ValueMember = "Id";
comboBox1.DataSource = lstItems;
comboBox1.BindingContext = this.BindingContext;
私の場合、Browsable
属性がfalse
に設定されているプロパティにバインドしました。
つまり次の理由でエラーが発生しました。
[Browsable(false)]
public string MyProperty { get; set; }
そして、属性を削除するだけで解決しました。
public string MyProperty { get; set; }
私の問題は、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}";
}
私の場合、DataTableにバインドしていると思ったときに、DataSetにバインドしていました。
if (lstItems.Count > 0)
{
comboBox1.DataSource = lstItems;
comboBox1.DisplayMember = "Name";
comboBox1.ValueMember = "Id";
}
tldr:バインドしているソースが空でないことを確認してください。
同じエラーメッセージが表示されていました
'新しい表示メンバーにバインドできません。パラメーター名:newDisplayMember'
次のようなコードから
bindingSource.DataSource = _MyDict;
comboBox.DisplayMember = "Value";
comboBox.ValueMember = "Key";
バインディングソースはすでにデザイナに接続されています。
ValueMember
プロパティを設定すると、コンボボックスはリフレクションを使用するリスト内のインスタンスを見つけようとします(おそらくプロパティが実際に存在することを確認するため)。ソースコレクションが現在空の場合、これは失敗します。