2

ここでかなり具体的で奇妙な問題が発生しました.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 つあります。

  1. コメント行を入れても、ComboBox A から 2 番目の選択を行うまで、すべて正常に動作します。別の言い方をすれば、ComboBox A から一度選択すると、ComboBox B は入力に基づいて更新されます。しかし、A からの選択が変更された場合、B は最後に表示された値を固定し、長いリストはスクロールしても更新されなくなります。

  2. ComboBox A と B を満たすコードは、クリック ハンドラーと同様にほぼ同じですが、A は常に問題なく動作し、A から 2 番目の選択を行うと B がフリーズします。

この原因については理論化することしかできませんが、私の推測では、ボックス化解除では、2 回触れるのを嫌う一時的なメモリ ロケーションが使用されます。A の選択に基づいて B に入力するコードにも問題がある可能性がありますが、ボックス化解除がコメント アウトされているときに問題なく動作するという事実は、その疑念を軽減します。

私が知る限り、次のいずれかを行う必要があります。

  1. 別の方法で SelectedItem にアクセスする
  2. ボックス化解除せずに SelectedItem のデータにアクセスする
  3. 開封を完全に回避する方法を見つける

書式設定についてお詫び申し上げます。StackOverflow は、読みやすくするための私の試みを無視しているようです

4

1 に答える 1

0

コメントで例外をチェックすることを提案してくれたThomasLevesque(https://stackoverflow.com/users/98713/thomas-levesque )に心から感謝します。

Aで新しい選択を行った後、さまざまな情報で満たされた新しい辞書をComboBox Bに割り当てたいので、最初にそのBのデータソースをnullに設定しました(AのSelectedIndexChangedイベントで)。これにより、BのSelectedIndexChangedイベントが発生し、nullリストのSelectedItemにアクセスしようとして、NullReferenceErrorがスローされ、エラーとフリーズが発生しました。

これを回避する方法は2つあります。

  1. 値のボックスを解除する前に、BのSelectedItemがnullかどうかを確認します
  2. 他のコードを使用して、SelectedIndexChangedイベントがBのSelectedItemにアクセスしないようにする
于 2012-10-26T21:43:31.440 に答える