2009-04-03 15 views
1

注:WinFormではコントロールを動的に削除する問題

私はTableLayoutPanelで問題に直面しています。私はTableLauoutPanelを使ってコントロールのdynamicallを追加したり削除したりしています。私の問題は、私は中央でコントロールを削除する(すなわち、TextBox1、TextBox2、TextBox3を追加して、今度はTextBox2を削除した)場合、他のコントロールは適切なサイズに変更されません。最後のコントロール(TextBox3)が削除されると、そのサイズ変更が正しく行われます。私はここに自分のコードを添付しました。何が問題ですか?

/// HERE TBLはあなたにも動的に各コントロールのための新しいテーブル行を作成しようとしているように見えるので、あなたがFlowLayoutPanelと少し良くするかもしれない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); 
} 

答えて

1

は、現時点ではそれをテストすることはできませんが、あなたの問題はコントロールがであることを行を除去するためのロジックであるように見えます。

tbl.RowCount -= 1 

常に最後の行を削除しようとしています。コントロールを1行上に移動して移動した後に、行内にある各コントロールを移動する必要があります。多分このようなもの...

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

です。同様の効果を得るためにはスタイルを設定できる必要があり、自動的に「行の作成」を処理できます。

関連する問題