現在選択されている値に従って他のコントロールを更新/無効にするには、ListBoxで選択したアイテムを追跡する必要があります。ListBox SelectedValueChanged/SelectedIndexChangedデータソースが変更されたときに起動しない
この問題を再現するためのコードです:addButton
、removeButton
とlogSelectionButton
:
public partial class Form1 : Form
{
private readonly BindingList<string> List = new BindingList<string>();
public Form1()
{
InitializeComponent();
listBox1.DataSource = List;
listBox1.SelectedValueChanged += (s, e) => System.Diagnostics.Debug.WriteLine("VALUE");
listBox1.SelectedIndexChanged += (s, e) => System.Diagnostics.Debug.WriteLine("INDEX");
addButton.Click += (s, e) => List.Add("Item " + (List.Count + 1));
removeButton.Click += (s, e) => List.RemoveAt(List.Count - 1);
logSelectionButton.Click += (s, e) =>
{
System.Diagnostics.Debug.WriteLine("Selected Index: " + listBox1.SelectedIndex);
System.Diagnostics.Debug.WriteLine("Selected Value: " + listBox1.SelectedValue);
};
}
}
私のフォームは、リストボックスにlistBox1
と3つのボタンがあります。
あなたは(空のリストから始まる)addButton
を押した場合は、removeButton
、最後にaddButton
再び、SelectedValueChanged
もSelectedIndexChanged
どちらもあなたが最後addButton
プレスの前と後のlogSelectionButton
を押してもかかわらず、最後addButton
押すだけで起動します、あなたはSelectedIndex
とSelectedValue
の値がそれぞれ-1から0に、null
から「項目1」に変更され、リストボックスで「項目1」が選択されていることがわかります。
これは、最初のアイテムが既に選択されていても、ユーザーが手動でリストボックスのアイテムを選択するまで、選択したアイテムに応じて更新する必要があるその他のコントロールを無効にします。
いずれの回避策も考えられません。また、BindingListのListChanged
イベントを購読して、リストが空かどうかを確認しますが、イベントハンドラが起動する前または後にリストボックスの項目が更新されるかどうかはわかりません。
これは動作するようには思えません。明らかに、選択が実際に変更される前に 'CurrentChanged'が発生し、現在選択されている項目を追跡する必要があります。私は別の解決策を見つけました(自分の回答を参照)。 – Juan
お望みです。なぜなら、バインディングマネージャの 'Current'プロパティを通して同じものが利用可能になったときに、コントロールの選択が変更されて、それが正しいのであれば、なぜあなたが気にしているのかわかりません。すべての自動マスターディテールバインディングとナビゲータは、特定のコントロールイベント/プロパティに反応するのではなく、そのアプローチを使用します。 –
「Current」から選択した値を取得できるかどうかわかりませんでした。ニースのアプローチ。 – Juan