2

Windows フォームに、無効になっているボタンがあります (Enabled = false)。

ユーザーがコンボボックスから項目を選択し、CheckedListBox から少なくとも 1 つの項目をチェックしたときに有効にしたいと考えています。ユーザーは、次のように、Checkbox を介して CheckedListBox 内のすべての項目をチェック/チェック解除できます。

private void checkBoxAll_CheckedChanged(object sender, EventArgs e)
{
    for (int x = 0; x < MemberListBox.Items.Count; x++)
    {
        MemberListBox.SetItemChecked(x, checkBoxAll.Checked);
    }
    GenPacketBtn.Enabled = MonthAndMemberSelected();
}

だから、これは簡単だと思いました-コンボボックスとCheckedListBoxの両方で何かが選択されていることを確認するだけです:

private bool MonthAndMemberSelected()
{
    return ((comboBoxMonth.SelectedIndex >= 0) && (MemberListBox.SelectedIndex >= 0));
}

...そして、次のように、これらのコントロールが変更されたときにボタンを有効または無効にします。

private void comboBoxMonth_SelectedIndexChanged(object sender, EventArgs e)
{
    GenPacketBtn.Enabled = MonthAndMemberSelected();
}

private void MemberListBox_SelectedIndexChanged(object sender, EventArgs e)
{
    GenPacketBtn.Enabled = MonthAndMemberSelected();
}

チェックボックスは CheckedListBox に対して大きな影響力を持っているため、そのコードを checkBoxAll_CheckedChanged() イベントに追加しました。

private void checkBoxAll_CheckedChanged(object sender, EventArgs e)
{
    for (int x = 0; x < MemberListBox.Items.Count; x++)
    {
        MemberListBox.SetItemChecked(x, checkBoxAll.Checked);
    }
    GenPacketBtn.Enabled = MonthAndMemberSelected();
}

...そして(必死になってうまくいかなかったので)その Clicked イベントにも:

private void checkBoxAll_Click(object sender, EventArgs e)
{
    GenPacketBtn.Enabled = MonthAndMemberSelected();
}

しかし、それは機能しません-ボタンを有効にすると機能しますが、一度有効にすると、CheckedListBoxのすべての項目のチェックを外しても、再び無効になりません。なぜだめですか?

4

1 に答える 1

1

コメントで述べたように、1 つの問題は、checkedItemBox項目がチェックされていないことを検証するのではなく、 の選択されたインデックスをチェックしていることだと思います。

チェックインMonthAndMemberSelectedを次のようなものに置き換えることができます。

return ((comboBoxMonth.SelectedIndex >= 0) 
    && (MemberListBox.CheckedItems.Count > 0));

MemberListBoxあなたのチェックされた項目ボックスであると仮定します。これにより、少なくとも 1 つの項目が現在チェックされていることが検証されます。

これで当面の問題は解決するかもしれませんが、相互に依存するフィールドがさらにある場合は非常に複雑になる可能性があるため、長期的には UI から検証ロジックを分離することを検討することをお勧めします (これが小さい場合はあまり価値がないかもしれません)。迅速な問題を解決するためのツール)。

于 2015-11-14T14:07:11.717 に答える