(これまでのところ) チェックボックスのみを含む Windows フォームを作成しました。コンストラクターは 1 つのパラメーターを取ります: string[] attributes
. このattributes
配列の文字列ごとに、チェックボックスを作成します。
例えば:
string[] attributes = {
"Black",
"Red",
"Blue"
};
form1 = new MyForm(attributes);
form1.Show();
次のようにチェックボックスを作成します。
[ ] Black
[ ] Red
[ ] Blue
これはうまくいきます。次のステップは、次の動作を持つチェックボックス「すべてをチェック」を作成することです。「Check All」チェックボックスthis
を参照するために使用します。
いつ:
- ユーザーチェック
this
: 他のすべてのチェックボックスがチェックされます。 - User unchecks
this
: 他のすべてのチェックボックスがオフになります。 - 他のすべてのチェックボックスは手動でチェックされます:
this
あまりにもチェックされます. - すべてのチェックボックスがチェックされ、それらのいずれかがチェック解除されます。チェックも解除され
this
ます。
上記のルールをすべて実行できましたが、問題が発生し、それを修正する方法がわかりません。すべてのチェックボックスがオンになっていて、ユーザーが 1 つのチェックボックスをオフにすると、[すべてチェック] チェックボックスがオフになります。それも。「すべてチェック」チェックボックスがオフになったので、ユーザーが「すべてチェック」チェックボックスをオフにしたかのように、すべてのチェックボックスをオフにするuncheckイベントが自動的に呼び出されます。
CheckedChanged
チェックボックスをオフにする別のチェックボックスを呼び出しているときに、チェックボックスを実行しないように指示する方法はありますか?
これが私のコードです(すべて手作業で書かれているため、ビジュアルスタジオデザイナーは使用していません):
using System;
using System.Drawing;
using System.Windows.Forms;
class MyForm
{
public MyForm(string[] attributes)
{
SpawnControls(attributes);
}
private CheckBox[] m_attributes;
private CheckBox m_all;
private void SpawnControls(string[] attributes)
{
CheckBox dummy = new CheckBox();
int nAttr = attributes.Length;
m_attributes = new CheckBox[nAttr];
for (int i = 0; i < nAttr; i++)
{
m_attributes[i] = new CheckBox();
m_attributes[i].Text = attributes[i];
m_attributes[i].Location = new Point(5, dummy.Height * i);
m_attributes[i].CheckedChanged += attribute_CheckedChanged;
Controls.Add(m_attributes[i]);
}
m_all = new CheckBox();
m_all.Text = "Check All";
m_all.Location = new Point(5, m_attributes[nAttr - 1].Bottom);
m_all.CheckedChanged += all_CheckedChanged;
Controls.Add(m_all);
}
private void attribute_CheckedChanged(object sender, EventArgs e)
{
if (((CheckBox)sender).Checked)
{
foreach (CheckBox cb in m_attributes)
{
if (cb.Checked == false)
{
return;
}
}
m_all.Checked = true;
}
else if (m_all.Checked)
{
m_all.Checked = false;
}
}
private void all_CheckedChanged(object sender, EventArgs e)
{
if (m_all.Checked)
{
foreach (CheckBox cb in m_attributes)
{
cb.Checked = true;
}
}
else
{
foreach (CheckBox cb in m_attributes)
{
cb.Checked = false;
}
}
}
}