SQLテーブルのリストに基づいて動的に作成されるチェックボックスをホストするユーザーコントロールを作成しました。私はすべてのチェックボックスを選択/選択解除するオプションを提供する必要があります。これは、動的に作成されていないときは簡単です。私が見つけた問題は、(ALL)をクリックすると、すべてのチェックボックスをオンまたはオフにしますが、個々の選択を許可しないことです。ドロップダウンリストのユーザーコントロールにあるすべてのチェックボックスをチェック/チェック解除する方法
のチェックボックスを生成するコードはこれです:
public void GenerateCheckboxesOnUserControl()
{
// Create user control.
UserControl2 flp = new UserControl2();
UserControl2 userControl2 = new UserControl2();
userControl2.BorderStyle = BorderStyle.None;
this.customComboBox4.DropDownControl = userControl2.flpanel;
//*****************************//
List<string> ItemList = new List<string>();
ItemList.Add("Pending");
ItemList.Add("New");
ItemList.Add("Started");
ItemList.Add("Declined");
ItemList.Add("Completed");
ItemList.Add("Accepted");
ItemList.Add("Close");
ItemList.Add("(ALL)");
int i = ItemList.Count;
CheckBox[] box = new CheckBox[i];
_cbStatus = box;
for (i = 0; i < ItemList.Count; i++)
{
box[i] = new CheckBox();
box[i].Name = "cb" + ItemList[i].ToString();
box[i].Tag = ItemList[i];
box[i].Text = ItemList[i].ToString();
box[i].Focus();
box[i].BringToFront();
box[i].CheckedChanged += new System.EventHandler(this._cbStatus_CheckedChanged);
this.customComboBox4.DropDownControl.Controls.Add(box[i]);
count++;
}
//****************************//
}
/チェックを外しをチェックするために使用されるコードはこれです:
明らかpublic void _cbStatus_CheckedChanged(object sender, EventArgs e)
{
if (sender is CheckBox == false) return;
UserControl2 userControl2 = new UserControl2();
string message = string.Empty;
string m = "";
for (int i = 0; i < count; i++)
{
if (_cbStatus[i].Checked)
{
m += _cbStatus[i].Name + ", ";
message += string.Format("boxes[{0}] is clicked\n ", i + " " + _cbStatus[i].Name);
}
foreach (Control cbStatus in customComboBox4.DropDownControl.Controls)
{
CheckBox cb = (CheckBox)cbStatus;
if (cb.Name == "cb(ALL)" && cb.Checked)
{
_cbStatus[i].Checked = true;
}
else
if (cb.Name == "cb(ALL)" && !cb.Checked)
{
_cbStatus[i].Checked = false;
}
}
}
customComboBox4.Text = m;
//MessageBox.Show(message);
}
、私はforeach
ループを削除した場合、それは意志私は個人的な選択をすることができます。それが適切に機能するようにするための提案はありますか?
これは私のユーザーコントロールの分離コードです:
private void InitializeComponent()
{
this.flpanel = new System.Windows.Forms.FlowLayoutPanel();
this.SuspendLayout();
//
// flpanel
//
this.flpanel.AutoScroll = true;
this.flpanel.Location = new System.Drawing.Point(4, 13);
this.flpanel.Name = "flpanel";
this.flpanel.Size = new System.Drawing.Size(215, 135);
this.flpanel.TabIndex = 0;
//
// UserControl2
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.ActiveCaption;
this.Controls.Add(this.flpanel);
this.Name = "UserControl2";
this.Size = new System.Drawing.Size(222, 151);
this.ResumeLayout(false);
}
public System.Windows.Forms.FlowLayoutPanel flpanel;
問題を解決できません。個人の選択をするために単一のチェックボックスをクリックすることを止めるのは誰ですか? (ALL)チェックボックスをクリックすると、すべてのチェックボックスが(ALL)チェックボックスと同じ状態(チェックボックスまたはチェックボックスなし)になりますか? – Steve
CheckedChangedイベントハンドラのforeachループがかなり壊れています。 [すべて]ボックスにチェックが入っていない場合は、何もチェックを外さないでください。同様に、ユーザがAll以外のチェックボックスをクリックした場合、Allはアンティッキでなければなりません。ちょうどループを完全に取り除き、実際にクリックされた場合は、何かをクリックしてください。 –
@Hans Passant、私はあなたが正しいと思います。代わりにその解決策を試してみましょう。私はそれがより好きだと思うことさえある。 –