7

私は現在、プログラムの特定の側面で CheckedListBoxes を使用する Window アプリを開発しています。私が遭遇した問題は、リスト項目がチェックされたときにフォームボタンを有効にできるように、項目がチェックされたときにトリガーされるイベントを見つけようとしていたことです。

問題は、次を使用してみたことです。

private void clbAvailMods_ItemCheck(object sender, ItemCheckEventArgs e)
    {
        if(e.NewValue == CheckState.Checked)
        {
            btnInstall.Enabled = true;
        }
    }

しかし、if ステートメントにブレークポイントを設定すると、リストボックス内の項目をチェックしても決して起動しません。

ここで何か間違ったことをしていますか?

4

5 に答える 5

21

Windows フォームの標準的なトリックは、すべてのイベントの副作用が完了するまでコードの実行を遅らせることです。Control.BeginInvoke() メソッドを使用してコードの実行を遅らせます。これで問題が解決します:

    private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e) {
        this.BeginInvoke(new MethodInvoker(evalList), null);
    }

    private void evalList() {
        bool any = false;
        for (int ix = 0; ix < checkedListBox1.Items.Count; ++ix) {
            if (checkedListBox1.GetItemChecked(ix)) {
                any = true;
                break;
            }
        }
        btnInstall.Enabled = any;
    }
于 2010-07-05T21:46:18.897 に答える
2

NewValueプロパティを使用して、CheckedItems.Countを手動で更新できます。これは、少なくとも1つの項目がチェックされている場合にのみボタンを有効にするために使用するコードです。

private void checkedListBoxProds_ItemCheck(object sender, ItemCheckEventArgs e)
{
    this.buttonGenerar.Enabled = ((this.checkedListBoxProds.CheckedItems.Count + (e.NewValue == CheckState.Checked ? 1 : -1)) > 0);
}
于 2010-09-13T12:37:53.723 に答える
0

SelectedIndexChanged イベントだと思いますが、今確認します。

編集: SelectedIndexChanged イベントは機能します。しかし、チェックボックスがチェックされているかどうかに関係なく、それは発火しています。そのため、必要に応じてチェック済みの状態を確認します。

しかし、余談ですが、ItemCheckイベントを使用したときは、テキストだけでなくチェックボックスを実際にチェックしたときに発生しました。

于 2010-07-05T20:41:22.143 に答える
0

いくつかの潜在的な落とし穴。おそらく、VS.Net GUI を使用してイベントを追加し、コントロールに組み込まれるようにしました。項目を 2 回クリックしてみてください。1 回目は項目にフォーカスを与え、もう 1 回はチェック状態を切り替えます。最初のクリックで項目のチェック状態を切り替えたい場合は、"CheckOnClick" プロパティを true に設定します。

于 2010-07-05T20:38:37.220 に答える