2009-04-03 5 views
1

Hinweis: In WinFormProblem beim Entfernen der Steuerelemente dynamisch

ich konfrontiert Problem in TableLayoutPanel. Ich Hinzufügen und Entfernen der Steuerdynamik mit TableLauoutPanel. Mein Problem ist, wenn ich das Steuerelement in der Mitte entferne (dh ich habe TextBox1, TextBox2 und TextBox3 hinzugefügt und jetzt habe ich TextBox2 entfernt), werden zu diesem Zeitpunkt andere Steuerelemente nicht richtig angepasst. Wenn das letzte Steuerelement (z. B. TextBox3) entfernt wird, wird dessen Größe geändert. Ich habe meinen Code hier angehängt. Was ist das Problem?

/// HIER TBL ist die Table

private void AddText_Click(object sender, EventArgs e) 
{  
    TextBox txt = new TextBox(); 
    txt.MouseDoubleClick += new MouseEventHandler(txt_MouseDoubleClick); 
    txt.Multiline = true; 
    txt.Dock = DockStyle.Fill; NEWADD(txt); 
} 

private void NEWADD(Control ctrl) 
{ 
    tbl.RowCount += 1; 
    tbl.RowStyles.Add(new RowStyle(SizeType.Percent, 100F/tbl.RowStyles.Count)); 
    tbl.Controls.Add(ctrl, 0, tbl.RowStyles.Count - 1); 

    foreach (RowStyle row in tbl.RowStyles) 
    { 
     row.SizeType = SizeType.Percent; 
     row.Height = 100F/(tbl.RowStyles.Count); 
    } 
} 

private void RemoveControl(Control ctrl) 
{ 
    tbl.RowCount -= 1; 
    tbl.Controls.Remove(ctrl); 
    tbl.RowStyles.Clear(); 

    for (int i = 0; i < tbl.Controls.Count; i++) 
    { 
     tbl.RowStyles.Add(new RowStyle(SizeType.Percent, 100F /(tbl.RowStyles.Count +1))); 
    } 

    foreach (RowStyle row in tbl.RowStyles) 
    { 
     row.SizeType = SizeType.Percent; 
     row.Height = 100F/(tbl.RowStyles.Count); 
    } 

    tbl.Refresh(); 
} 

void txt_MouseDoubleClick(object sender, MouseEventArgs e) 
{ 
    RemoveControl(sender as Control); 
} 

Antwort

1

Kann es nicht zur Zeit testen, aber es sieht aus wie das Problem die Logik zur Entfernung der Reihe ist, dass die Steuerung in ist.

tbl.RowCount -= 1 

ist immer die letzte Zeile gehen zu entfernen. Sie müssen sich durch jedes Steuerelement bewegen, das sich in einer Reihe hinter dem Element befindet, das Sie entfernen möchten, und die Steuerelemente um eine Zeile nach oben verschieben. Vielleicht so etwas ...

foreach(Control control in tbl.Controls) 
{ 
    if(control.Row > controlToRemove.Row) 
     control.Row--; 
} 
0

Da es so aussieht, bist du auch eine neue Tabellenzeile für jedes Steuerelement dynamisch erstellen versuchen, könnten Sie ein wenig besser mit einem Flowlayoutpanel tun. Sie sollten in der Lage sein, es zu stylen, um einen ähnlichen Effekt zu erzielen, und es wird in der Lage sein, automatisch mit der "Zeilenerstellung" umzugehen.

Verwandte Themen