2009-04-03 8 views
1

Remarque: Dans WinFormProblème lors de la suppression dynamique des contrôles

Je fais face à un problème dans TableLayoutPanel. J'ajoute et supprime le contrôle dynamicall en utilisant TableLauoutPanel. Mon problème est, si je supprime le contrôle au milieu (à savoir j'ai ajouté TextBox1, TextBox2 et TextBox3 et maintenant j'ai supprimé TextBox2) à ce moment d'autres contrôles ne sont pas redimensionnés correctement. Lorsque le dernier contrôle (par exemple TextBox3) est supprimé, son redimensionnement correctement. J'ai joint mon code ici. Quel est le problème?

/// ICI TBL est le TableLayoutPanel

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

Répondre

1

ne peux pas tester pour le moment, mais il semble que votre problème est la logique de la suppression de la ligne que le contrôle est.

tbl.RowCount -= 1 

va toujours enlever la dernière ligne. Vous devez vous déplacer à travers chaque contrôle qui est dans une rangée après le que vous voulez supprimer et déplacer vos contrôles d'une rangée. Peut-être quelque chose comme ça ...

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

Comme il semble que vous aussi essayer de créer dynamiquement une nouvelle ligne de table pour chaque commande, vous pourriez faire un peu mieux avec un FlowLayoutPanel. Vous devriez pouvoir le styliser pour obtenir un effet similaire et il sera capable de gérer automatiquement la "création de ligne".

Questions connexes