2

WinForms アプリケーションに groupBox があります。このグループ ボックスには、さまざまなオプション/設定を選択するための約 25 個のコンボ ボックスがあります。それらはすべて同じアイテム コレクション (ドロップダウン アイテム) を共有します。デフォルトでは、それらはすべて異なる項目に設定されています (2 つのコンボボックスに同じテキストはありません)。

ただし、私のアプリのカスタマイズ可能な性質により、ユーザーは設定を別のものに変更できます。私がしたいのは、ユーザーがcomboBoxSAの選択インデックスを3に変更し、すでに3を選択している別のcomboBoxがある場合(これにより、同じテキストを表示する2つのcomboBoxが表示されます)、何らかの方法で設定ができないとユーザーにフラグを立てることです。複製されました。

これは、ユーザーが selectionIndex を変更したとき、ユーザーがフォームを閉じようとしたときなど、すぐに発生する可能性があります。現時点でこれを実装することができる唯一の方法は、コンボ ボックスごとに別の selectionIndex 変更関数を使用し、そのコンボ ボックスのテキストを他のすべてのコンボ ボックスと比較することです。

これを短縮するためのアイデアはありますか?

4

3 に答える 3

0

これは私がしたことです:

コンボボックス リストを作成しました:

List<ComboBox> toolParameterComboBoxes = new List<ComboBox>();

そのリストにすべてのコンボボックスを追加しました:

toolParameterComboBoxes.Add(countcomboBox);(繰り返します...)

これを使用するすべてのコンボ ボックスの selectionIndexChanged イベントを変更しました。

private void validateComboBox(object sender, EventArgs e)
{
  ComboBox thisCB = sender as ComboBox;
  if (thisCB.Text != "")
  {
       foreach (ComboBox cb in toolParameterComboBoxes)
       {
           if (thisCB.Name != cb.Name && thisCB.Text == cb.Text && thisCB.Text != "" && cb.Text != "")
           {
               MessageBox.Show("You cannot duplicate tool parameters." + "\r\n" + "\r\n" 
                            + "That option has been selected in " + cb.Name.Replace("comboBox", ""), "Error");
                        thisCB.SelectedIndex = 0;
                        break;
           }
        }
  }
}

これは、空のコンボ ボックスを処理します。何らかの理由thisCB.Text = "";でうまくいかなかったので、空のコンボボックスアイテムを各コレクションに追加し、選択したインデックスを0に変更して、重複したアイテムを選択できないようにしました。

于 2013-01-03T22:45:54.150 に答える
0

さて、私はいくつかの ComboBoxes に重複が含まれているかどうかを判断する単純な方法から始めます。

public static bool containsDuplicates(IList<ComboBox> boxes)
{
    return boxes.Count != 
        boxes.Select(box => box.SelectedValue) //TODO cast if needed, or use some other property
        .Distinct()
        .Count();
}

個別の値の数が合計数より少ない場合、少なくとも 2 つの値が同じでなければなりません。

すべてのコンボ ボックスのリストを作成し (まだ値を選択していないものは除外する可能性があります)、それらをこのメソッドに渡します。

選択した各インデックス変更イベントで呼び出すことができます (すべてのコレクションがある場合は、最初にループしてそれぞれに追加するだけです)、またはフォームが送信されたときに呼び出すことができます。(または両方。)

于 2013-01-03T21:48:14.313 に答える