2011-06-01 9 views
8

मैं गतिशील रूप से tableLayoutPanel के लिए नियंत्रण उत्पन्न करता हूं। मेरे पास प्रत्येक पंक्ति में एक डिलीट बटन है। जब मैं उस पर क्लिक करता हूं, तो उस पंक्ति को हटा दिया जाना चाहिए।क्या TableLayoutPanel में किसी पंक्ति से सभी नियंत्रण हटाने का कोई तरीका है?

Dim removeBtn As New Button 
    AddHandler removeBtn.Click, AddressOf DeleteRow 
    tlp.Controls.Add(removeBtn, 5, rowCount) 

मैंने ऊपर दिए गए टेक्स्ट बॉक्स जोड़ने के लिए कोड नहीं दिखाया है। मैं क्लिक किए गए बटन की पंक्ति संख्या प्राप्त कर सकता हूं। इसका उपयोग करके, इस पंक्ति से सभी नियंत्रणों को कैसे हटाएं।

Private Sub DeleteRow(ByVal sender As System.Object, ByVal e As System.EventArgs) 
    Dim currentRow As Integer = CType(CType(sender, Button).Parent, TableLayoutPanel).GetRow(CType(sender, Button)) 
    'Using this currentRow, how to delete this Row 
End Sub 

उत्तर

20
मूल रूप से

आपके पास करने के लिए:

  • कि पंक्ति से नियंत्रण की सूची प्राप्त करें और TLP
  • से उन्हें हटा TLP
  • नई पंक्ति सेट से संबंधित पंक्ति शैली निकालें हटाए गए एक
  • घटने के बाद प्रत्येक पंक्ति में प्रत्येक नियंत्रण के लिए सूचकांक पंक्ति गणना

ऐसा करने के लिए यहां VB.NET कोड है।

Public Sub RemoveRow(ByRef panel As TableLayoutPanel, ByRef rowIndex As Integer) 

    panel.RowStyles.RemoveAt(rowIndex) 
    Dim columnIndex As Integer 
    For columnIndex = 0 To panel.ColumnCount - 1 
     Dim Control As Control = panel.GetControlFromPosition(columnIndex, rowIndex) 
     panel.Controls.Remove(Control) 
    Next 
    Dim i As Integer 
    For i = rowIndex + 1 To panel.RowCount - 1 
     columnIndex = 0 
     For columnIndex = 0 To panel.ColumnCount - 1 
      Dim control As Control = panel.GetControlFromPosition(columnIndex, i) 
      panel.SetRow(control, i - 1) 
     Next 
    Next 
    panel.RowCount -= 1 
End Sub 

यहां एक सी # एक्सटेंशन विधि है जो आपके लिए यह करेगी।

public static void RemoveRow(this TableLayoutPanel panel, int rowIndex) 
{ 
    panel.RowStyles.RemoveAt(rowIndex); 

    for (int columnIndex = 0; columnIndex < panel.ColumnCount; columnIndex++) 
    { 
     var control = panel.GetControlFromPosition(columnIndex, rowIndex); 
     panel.Controls.Remove(control); 
    } 

    for (int i = rowIndex + 1; i < panel.RowCount; i++) 
    { 
     for (int columnIndex = 0; columnIndex < panel.ColumnCount; columnIndex++) 
     { 
      var control = panel.GetControlFromPosition(columnIndex, i); 
      panel.SetRow(control, i - 1); 
     } 
    } 

    panel.RowCount--; 
} 
+1

@emaillenin की सामग्री को साफ हो जाएगा: VB.NET –

+0

को अनुवाद के लिए धन्यवाद क्यों लोगों को रोस्टाइल को हटाना होगा? – sammarcow

3

जोहान और emaillenin के जवाब के अलावा आप निम्न पंक्ति

panel.SetRow(control, i - 1); 
इस

if (control != null) panel.SetRow(control, i - 1); 

खाली फील्ड के लिए

बदलना चाहिए और यह भी फैला नियंत्रण एक त्रुटि यहाँ थेरेस अगर फेंक होगा नहीं शून्य के लिए जाँच करें।

-7

क्यों इतना मेहनत ... उपयोग tableLayoutpanel1.Controls.Clear()

इस तालिका में पैनल

+5

जो * ओपी * क्या करने के लिए पूछ रहा था * नहीं है। –

संबंधित मुद्दे

 संबंधित मुद्दे