7

私はcheckedListBoxにチェックされたアイテムの数を表示しようとしています:checkedListBox1.CheckedIndices.Count しかし、ラベルに表示したい場合、どうすればカウントを更新できますか? ItemCheck イベントにすべてを書き込もうとしました。

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
    {            
        label1.Text= checkedListBox1.CheckedIndices.Count;
    }

しかし、アイテムのチェックを外してもカウントが増加します:(助けていただければ幸いです!

4

3 に答える 3

3

イベントのドキュメントには、次のように記載されています。CheckedListBox.ItemCheck

チェック状態は、ItemCheck イベントが発生するまで更新されません。

そのため、イベントが呼び出されたとき、CheckedIndices.Countはまだ更新されていません。これを克服するには、クラスをサブクラス化し、イベントのCheckedListBox新しいイベントを発生させる必要があります。CheckedListBox.ItemCheck

public class MyCheckedListBox : CheckedListBox
{
    public event ItemCheckEventHandler ItemCheckedChanged;
    protected virtual void OnItemCheckedChanged(ItemCheckEventArgs ice)
    {
        var h = ItemCheckedChanged;
        if (h != null)
            h(this, ice);
    }

    protected override void OnItemCheck(ItemCheckEventArgs ice)
    {
        base.OnItemCheck(ice);

        ThreadPool.QueueUserWorkItem(new WaitCallback((state) =>
            {
                this.BeginInvoke(new Action<ItemCheckEventArgs>(OnItemCheckedChanged), ice);
            }));
    }

いいえ、ItemCheckedChangedサブスクライブできるイベントがあります。

実際、サブクラス化する必要はありません。これはフォーム自体で行うことができますが、これはよりクリーンです。

それはどのように機能しますか?

ItemCheckイベントはSetItemCheckStateメソッド内で呼び出されます。このメソッドは、イベント ( ) を呼び出した、アイテムのチェック状態を変更しますOnItemCheck。また、呼び出しSetItemCheckは、アプリケーションのメッセージ キューに渡される Windows メッセージの結果です。このメッセージが処理された後にメッセージを起動する必要があるため、このメッセージの後にメッセージが処理されるように、新しいメッセージをキューに投稿する必要があります。このBeginInvokeメソッドは実際にメッセージをメッセージ キューにポストしますが、それは別のスレッドから呼び出された場合のみです。そのためBeginInvoke、新しいスレッド形式のスレッド プールを呼び出しました。

これに対する別の解決策として、メッセージを登録して手動でメッセージ キューに投稿することもできますが、それにはさらに多くのコードが必要になります。

于 2013-03-09T11:54:03.890 に答える
1

に応じて、1つを追加または1つ差し引くだけですe.NewValue==CheckState.Checked

于 2013-03-09T11:45:15.193 に答える
0

むしろ、次のようにします。

int checkedcount = 0;
foreach(var item in checkedListBox1.CheckedItems){
   if(checkedListBox1.GetItemCheckState(checkedListBox1.Items.IndexOf(item) == System.Windows.Forms.CheckState.Checked)
      checkedcount++;
}

詳細については、こちらを参照してください

于 2013-03-09T11:47:58.667 に答える