2017-11-13 2 views
0

SQL 테이블의 목록을 기반으로 동적으로 생성 된 일부 확인란을 호스트하기 위해 사용자 정의 컨트롤을 만들었습니다. 모든 확인란을 선택/선택 취소 할 수있는 옵션을 제공해야합니다. 이것은 동적으로 생성되지 않을 때 쉽게 할 수 있습니다. 내가 찾은 문제점은 일단 (ALL)을 클릭하면 모든 체크 박스를 체크하거나 체크하지 않겠지 만 개별 선택을 허용하지 않는다는 것입니다. 나는 foreach 루프를 제거하면, 그것은 것,드롭 다운 목록의 사용자 정의 컨트롤에있는 모든 확인란을 선택/선택 취소 할 수 있습니다.

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); 
} 

분명히 :

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

    } 

    //****************************// 
} 

확인하는 데 사용되는 코드/선택 해제는 이것이다 :

의 체크 박스를 생성하는 코드는 다음입니다 내가 개인적인 선택을하도록 허락 해 준다. 제대로 작동하게하려면 어떤 제안을해야합니까? "CB (전체)"의 체크를 보낸 사람이 있다면

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

@ 한스 패전트, 네 말이 맞다고 생각해. 그 해결책을 대신 사용해 보도록하겠습니다. 나는 심지어 내가 더 좋아한다고 생각한다. –

답변

1

당신은 다른 모든 확인란의 선택을 취소/확인해야합니다 Checked

Unchecked 내 사용자 컨트롤의 코드 숨김입니다 . 그리고이 루프에서 "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; 
     } 
    } 
} 

진짜 재미가 시작 "CB (ALL)"를 자동으로 사용자가 수동으로 선택하는 경우/체크되지 않은 :

그래서 코드는 다음과 같이 보일 것이다 다른 모든 상자.

관련 문제