2017-11-13 11 views
0

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ループを削除した場合、それは意志私は個人的な選択をすることができます。それが適切に機能するようにするための提案はありますか?

Unchecked Checked

これは私のユーザーコントロールの分離コードです:

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; 
+0

問題を解決できません。個人の選択をするために単一のチェックボックスをクリックすることを止めるのは誰ですか? (ALL)チェックボックスをクリックすると、すべてのチェックボックスが(ALL)チェックボックスと同じ状態(チェックボックスまたはチェックボックスなし)になりますか? – Steve

+0

CheckedChangedイベントハンドラのforeachループがかなり壊れています。 [すべて]ボックスにチェックが入っていない場合は、何もチェックを外さないでください。同様に、ユーザがAll以外のチェックボックスをクリックした場合、Allはアンティッキでなければなりません。ちょうどループを完全に取り除き、実際にクリックされた場合は、何かをクリックしてください。 –

+0

@Hans Passant、私はあなたが正しいと思います。代わりにその解決策を試してみましょう。私はそれがより好きだと思うことさえある。 –

答えて

1

チェックの送信者が「CB(すべて)」であった場合にのみ、他のすべてのチェックボックスのチェックを外す/確認する必要があります。そして、このループで "cb(All)"自体を省略しなければなりません。

だからあなたのコードは次のようになります。あなたはまた、ユーザーが手動で未チェック/チェックすると/、自動的に「CB(ALL)」をオフにチェックするという目標を持っている場合、本当の楽しみは、始まり

var eventSendingCheckbox = sender as CheckBox 
if(eventSendingCheckbox.Name == "cb(ALL)") 
{ 
    foreach(Control cbStatus in customComboBox4.DropDownControl.Controls) 
    { 
     if(cbStatus != eventSendingCheckbox) 
     { 
      cbStatus.Checked = eventSendingCheckbox.Checked; 
     } 
    } 
} 

を他のすべてのボックス。

関連する問題