ここでかなり具体的で奇妙な問題が発生しました.Googleと他の人は私に答えを与えることができませんでした.
A と B という 2 つの ComboBoxes を持つフォームがあります。A で項目を選択すると、データベースから情報が取得され、辞書に入れられ、BindingSource を使用して B に入れられます。ユーザーが B から何かを選択すると、戻り値が設定され、他には何もありません。
問題は ComboBox B にあります。その SelectedIndexChanged ハンドラーで、その SelectedItem のボックス化を解除しようとすると、ComboBox が「フリーズ」するため、ListBox B からの新しい選択の結果が表示されなくなり、長いリストは上下にスクロールしても更新されません。ただし、データの場所を覚えていれば、ComboBox は引き続き機能します。
B の SelectedIndexChanged ハンドラ:
private void comboBox2_SelectedIndexChanged_1(object sender, EventArgs e)
{
if (dataSourceSelect)
return;
else
{
ComboBox comboBox = (ComboBox)sender;
var dummy = comboBox2.SelectedItem;
// System.Collections.Generic.KeyValuePair<int, string> dummy2 =
// (System.Collections.Generic.KeyValuePair<int, string>)dummy;
}
}
問題の原因が SelectedItem プロパティではなく、ボックス化解除だけであることを示すダミー変数が 2 つあります。
この正確なコードを使用すると、ComboBox は正しく機能しますが、データを返すことはできません。コメントアウトされた行を有効にすると、値を返すことができますが、更新が停止します。
このコードでは表示されないことが 2 つあります。
コメント行を入れても、ComboBox A から 2 番目の選択を行うまで、すべて正常に動作します。別の言い方をすれば、ComboBox A から一度選択すると、ComboBox B は入力に基づいて更新されます。しかし、A からの選択が変更された場合、B は最後に表示された値を固定し、長いリストはスクロールしても更新されなくなります。
ComboBox A と B を満たすコードは、クリック ハンドラーと同様にほぼ同じですが、A は常に問題なく動作し、A から 2 番目の選択を行うと B がフリーズします。
この原因については理論化することしかできませんが、私の推測では、ボックス化解除では、2 回触れるのを嫌う一時的なメモリ ロケーションが使用されます。A の選択に基づいて B に入力するコードにも問題がある可能性がありますが、ボックス化解除がコメント アウトされているときに問題なく動作するという事実は、その疑念を軽減します。
私が知る限り、次のいずれかを行う必要があります。
- 別の方法で SelectedItem にアクセスする
- ボックス化解除せずに SelectedItem のデータにアクセスする
- 開封を完全に回避する方法を見つける
書式設定についてお詫び申し上げます。StackOverflow は、読みやすくするための私の試みを無視しているようです