2010-12-08 11 views
4

私はフォームにCheckedListBoxコントロールを持っています。ユーザーはこのリスト内で一度に1つの項目しかチェックできないようにしたいと思います。 ")。Winforms checkedlistboxは1つの項目をチェックします

これはCheckedListBoxとやり取りできますか、それとも別の方法で即興化する必要がありますか?

CheckedListBoxは、重要な場合に備えて、データベースから項目をロードすることによってフォームの読み込みに取り込まれます。

おかげ

編集

は、私は、彼らがチェックすることができますどのように多くのではなく、ユーザーが選択できる量(すなわちSelectionModeプロパティ)を制限するために見ているわけではない、私は明確にすべきだと思います。

+0

なぜチェックリストボックスを使用するのですか?あなたは単純なリストボックスを使うことができます。 –

+0

ユーザーは、残念ながら「チェック」できるように具体的に求めました。一度にチェックできるアイテムの数を制限する簡単な方法がないと判明した場合は、あなたが言うように通常のリストボックスを使用します。 – AndrewC

+0

代わりにComboBoxを使用します。 DropDownStyle =本当にリストが必要な場合は単純です。 –

答えて

3

あなたはItemCheckためにCheckedListBoxでイベントチェックを追加することによって、それを行うと、このような関数を使用できます。

さらに
if (checkIfAllowed) { 
    ... 
    } else { 

    } 

private static bool checkIfAllowed(CheckedListBox listBox) { 
     if (listBox.CheckedItems.Count > 0) { 
      return false; 
     } 
     return true; 
    } 

を次にイベントであなたは次のようにしていますこれを改善するには、アイテムをチェックする前にすべてのアイテムのチェックを外す機能/メソッドを追加します。ユーザーがチェックボックスをクリックすると、他のチェックボックスはすべてオフになります。

private static void uncheckAll(CheckedListBox listBox) { 
     IEnumerator myEnumerator; 
     myEnumerator = listBox.CheckedIndices.GetEnumerator(); 
     int y; 
     while (myEnumerator.MoveNext() != false) { 
      y = (int)myEnumerator.Current; 
      listBox.SetItemChecked(y, false); 
     } 
    } 

だからItemCheckイベントであなたが最初 uncheckAll(yourListBox)を実行しなければならないであろうと、単に項目がチェックされてみましょう:

はすべてチェックされた項目だけの使用オフにします。

編集: 私は以下のコードでテストしています。それが例外をスローするならば。

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) { 
     if (e.NewValue == CheckState.Checked) { 
      IEnumerator myEnumerator; 
      myEnumerator = checkedListBox1.CheckedIndices.GetEnumerator(); 
      int y; 
      while (myEnumerator.MoveNext() != false) { 
       y = (int)myEnumerator.Current; 
       checkedListBox1.SetItemChecked(y, false); 
      } 
     } 

    } 
+0

ありがとうMadboyしかし、uncheckAllメソッドはStackOverflowExceptionをスローします.SetItemCheckedを呼び出すたびにItemCheckedイベントがトリガされます。これは、uncheckAllが継続的にトリガされることを意味します。私は何かを忘れていない限り? – AndrewC

+0

私の更新答えを見てください。 – MadBoy

+0

優れており、完璧です。ありがとうございました! – AndrewC

1

試し設定.SelectionMode = SelectionMode.Oneプロパティを試してください。

+0

これは、一度に1つのアイテム(ハイライト)を選択することしかできません。いつでもチェックできるアイテムの数は制御しません。 :) – AndrewC

0

大量のリストから1人のユーザーを選択するのと同じようなやり方をしなければなりませんでした。話すRadioListBoxがないので、私はそれを手動でコーディングしました...

申し訳ありませんがVBで、私はそれを貼り付けた、ロジックは同じです。

Private m_NoFire As Boolean = False 

Private Sub lstSource_ItemCheck(_ 
     ByVal sender As Object, _ 
     ByVal e As System.Windows.Forms.ItemCheckEventArgs) Handles lstSource.ItemCheck 

    'When the checked state is set programatically, 
    'this event will still fire and cause the loop 
    'to run - infinatly. This line prevents that. 
    If m_NoFire Then Exit Sub 
    m_NoFire = True 

    'Ensure only one item is selected 
    For i As Integer = 0 To lstSource.Items.Count - 1 
     If Not lstSource.SelectedIndex = i Then 
      lstSource.SetItemChecked(i, False) 
     End If 
    Next 

    m_NoFire = False 

End Sub '-- lstSource_ItemCheck 
+0

KManはもっと良い方法を投稿しました。それでも、このコードは約5年間プロジェクトに入っていて、今私はそれを変更していません:D – Tom

+0

@KManは第二の考えで、そのリンクを見て、私はそれがチェックを制限するとは思えません。 – Tom

0

このコードは、はるかに簡単である可能性がある一つの変数が必要です。 新しいボックスをチェックするたびに、最後のチェックボックスをオフにして、チェックされたアイテムが2つ以上ないことを確認します。 プロパティーがSelectionMode = SelectionMode.One;に設定されていることを確認してください。

private int lastCheck = -1; 
    private void CheckListBox_IndexChanged(object sender, EventArgs e) { 
     int toUncheck = lastCheck; 
     if (toUncheck != -1) 
      CheckListBox.SetItemChecked(toUncheck, false); 
     lastCheck = CheckListBox.SelectedIndex; 
     CheckListBox.SetItemChecked(lastCheck, true); 
    } 

それともalternativlyデフォルトにlastCheckを設定することができ、必要に応じてボックスをチェックし、これを行う:

private void FormFoo_Load(object sender, EventArgs e) { 
     CheckListBox.SelectedIndex = 0; 
     lastCheck = CheckListBox.SelectedIndex; 
    } 

、その後、私は上記のコードの残りの部分は、以下の付属しています。

注意:私はlastCheck = **CheckListBox.SelectedIndex;**を使用してキーボードの移動をサポートしています。

関連する問題