2011-10-05 4 views
1

C#으로 코드 작성 중 2 개의 폼이 있고 코드가 텍스트 상자와 해당 확인란을 동적으로 작성합니다. 내가 작성한 코드는 동적 텍스트 상자와 체크 상자를 성공적으로 만듭니다. 그러나 선택한 확인란 행에서 텍스트 상자의 행을 삭제할 수 없습니다.체크 박스로 동적 텍스트 상자 삭제

public void CreateTextBox(int i, StringReader sr) 
     { 
     ProductForm form2 = new ProductForm(); 
     _cb = new CheckBox[i]; 
     form2.Visible = true; 
     form2.Activate(); 

     int x = 10; 
     int y = 30; 
     int width = 100; 
     int height = 20; 


     for (int n = 0; n < i; n++) 
     { 

      String line = sr.ReadLine(); 
      String[] line_ = line.Split(new char[] {'\t'}); 

      String cbName = "chkBox_" + n.ToString(); 



      _cb[n] = new CheckBox(); 
      _cb[n].Name = cbName; 
      _cb[n].Location = new Point(2, y); 
      _cb[n].Checked = false; 
      form2.Controls.Add(_cb[n]); 
      if (line.Length > 3) 
      { 

       for (int row = 0; row < 4; row++) 
       { 
        String name = "txtBox_" + row.ToString(); 
        TextBox tb = new TextBox(); 
        tb.Name = name; 
        tb.Text = line_[row].ToString(); 
        tb.Location = new Point(x, y); 
        tb.Height = height; 
        if (row == 1) 
        { 
         tb.Width = width * row; 
        } 

        if (row == 3) 
        { 
         tb.Width = width * 5; 
        } 
        else 
        { 
         tb.Width = width - 20; 
        } 
        x += 10 + width; 
        form2.Controls.Add(tb); 

       } 
      } 
      x = 10; 
      y += 25; 

     } 

    } 

    private void DeleteTextBoxButton_Click(object sender, EventArgs e) 
    { 
     //Here should I add a code in order to delete dynamically created 
     //textboxes by clicking checkbox and button 

    } 
} 
+0

그래, 뭐가 궁금한가요? – Marlon

+0

winforms와 비슷하지만 winforms/webforms/WPF에 대한 태그인지 여부를 알려주십시오. – Oded

+1

그는 누군가가 자신의 기능에 공란을 채우기를 원한다는 사실이 꽤 분명합니다. – wllmsaccnt

답변

1

확실하지 않습니다. 하지만 내가 옳다면,이 트릭을 할 수 있습니다.

해결 방법 1 : 모든 컨트롤을 만드는 동안 List<Controls>에 추가하십시오. 행을 삭제하기위한 체크 박스를 체크 할 때, 체크 박스의 이름을 얻고 List<Controls>에서 검색하십시오. 이렇게하면이 방법으로 클릭 한 행의 색인을 가져올 수 있습니다. 이제 해당 행의 컨트롤을 삭제하십시오.

해결 방법 2 : TablelayoutPanel에서 컨트롤을 만들면 모든 것이 쉽습니다.

편집

복사하기 버튼에 대한 이벤트 핸들러로, 자체 btn_click Form1에 모든 것을 붙여 넣습니다. 양식의 크기를 조금 크게 보자. 이제는 모든 것이 잘 작동합니다. 작동하지 않으면 알려주세요.

class MyControl 
{ 
    public TextBox txt1 { get; set; } 
    public TextBox txt2 { get; set; } 
    public TextBox txt3 { get; set; } 
    public TextBox txt4 { get; set; } 
    public CheckBox cb { get; set; } 

    public MyControl(TextBox txt1, TextBox txt2, TextBox txt3, TextBox txt4, CheckBox cb) 
    { 
     this.txt1 = txt1; 
     this.txt2 = txt2; 
     this.txt3 = txt3; 
     this.txt4 = txt4; 
     this.cb = cb; 
    } 

} 


    List<MyControl> list = new List<MyControl>(); 
    public int x = 50, n = 1; 
    TextBox txtTemp, txt1, txt2, txt3, txt4; 
    CheckBox cbTemp; 
    private void btn_Click(object sender, EventArgs e) 
    { 

     txtTemp = new TextBox(); 
     txtTemp.Location = new System.Drawing.Point(10, x); 
     txtTemp.Name = "txt1_" + n; 
     txt1 = txtTemp; 

     txtTemp = new TextBox(); 
     txtTemp.Location = new System.Drawing.Point(120, x); 
     txtTemp.Name = "txt2_" + n; 
     txt2 = txtTemp; 

     txtTemp = new TextBox(); 
     txtTemp.Location = new System.Drawing.Point(230, x); 
     txtTemp.Name = "txt3_" + n; 
     txt3 = txtTemp; 

     txtTemp = new TextBox(); 
     txtTemp.Location = new System.Drawing.Point(350, x); 
     txtTemp.Name = "txt4_" + n; 
     txt4 = txtTemp; 

     cbTemp = new CheckBox(); 
     cbTemp.Name = "cb1_" + n; 
     cbTemp.Enter += new EventHandler(cbTemp_Enter); 
     cbTemp.Location = new System.Drawing.Point(490, x); 

     this.Controls.Add(txt1); 
     this.Controls.Add(txt2); 
     this.Controls.Add(txt3); 
     this.Controls.Add(txt4); 
     this.Controls.Add(cbTemp); 

     list.Add(new MyControl(txt1, txt2, txt3, txt4, cbTemp)); 

     x += 40; 
     n++; 
    } 

    void cbTemp_Enter(object sender, EventArgs e) 
    { 
     if ((MessageBox.Show("Are you Sure?", "Warning", MessageBoxButtons.YesNo)) == DialogResult.No) 
      return; 

     CheckBox cbMain = (CheckBox)sender; 
     int index = Search(cbMain); 

     this.Controls.Remove(list[index].txt1); 
     this.Controls.Remove(list[index].txt2); 
     this.Controls.Remove(list[index].txt3); 
     this.Controls.Remove(list[index].txt4); 
     this.Controls.Remove(list[index].cb); 
    } 

    private int Search(CheckBox cbMain) 
    { 
     int temp = 0; 
     foreach (MyControl item in list) 
     { 
      if(cbMain.Name == item.cb.Name) 
       temp = list.IndexOf(item); 
     } 
     return temp; 
    } 
+0

지금 첫 번째 해결책을 시도하고 있습니다. 해결책 2는 좋게 들린다 그러나 나는 그것에있는 아무 경험도 없다. –

+0

List의 경우 공용 컨트롤 속성 (Textbox, Buttons 및 기타 포함)과 함께 클래스 (MyControls)를 만듭니다. 각 행을 만들 때 List에 MyControl 개체를 추가합니다. 거의 모든 것을 다 끝냈습니다. – Sandy

+0

rapsalands List 및 MyControl 객체를 만드는 방법에 대한 예제를 작성할 수 있습니까? –

1

WinForms의 경우 생성 된 TextBoxes를 CheckBox의 태그 필드에 두는 것이 좋습니다. 그런 다음 모든 CheckBox의 관리 목록을 보관하십시오. 삭제 버튼을 클릭하면 CheckBox 컬렉션을 반복합니다. 상태가 확인되면 TextBox를 태그 필드 밖으로 끌어 폼 콜렉션에서 제거한 다음 삭제합니다.

참고 :이 코드는 테스트되지 않았지만 원칙적으로 작동해야합니다.

업데이트 : 태그에 단일 TextBox를 저장하는 대신 최신 의견을 읽고 태그 목록에 다른 목록을 만들고 태그에 전체 목록을 저장하십시오. 그런 다음 delete 메서드를 반복합니다.

private List<CheckBox> _checkboxes = new List<CheckBox>(); 

public void CreateTextBox(int i, StringReader r) 
{ 
    // ... do your stuff here 
    _cb[n].Tag = tb; 
    // ... finish up 
    _checkboxes.Add(_cb[n]); 
} 

public void DeleteTextBoxButton_Click(object sender, EventArgs e) 
{ 
    foreach(var cb in _checkboxes) 
    { 
     if(cb.Checked) 
     { 
      TextBox tb = cb.Tag as TextBox; 
      if(tb != null) 
      { 
       form2.Controls.Remove(tb); 
      } 
     } 
    } 
} 
+0

정확히 그 태그 또는 이름 필드를 같이 할 것입니다. 그러나 내 버튼 기능에서 내 확인란과 텍스트 상자에 어떻게 액세스 할 수 있는지 모르겠습니다. foreach 또는 for 루프에서 어떻게 반복 할 수 있습니까? –

+0

내 샘플의 _checkboxes 속성은 메서드 외부의 클래스 수준에서 정의되므로 DeleteTextBoxButton_Click 메서드 내부에 표시됩니다. –

+0

나는 당신의 솔루션에서 정말로 길을 잃었습니다. 나는 노력했지만 나를 위해 일하게 만들 수 없었다. 아직 시도 중이다. –

관련 문제