2014-04-03 25 views
0

我有一個datagridview,在這個datagridview上面我設置了一個flowlayoutpanel,我想在其中用戶可以在某些searchterms中鍵入的內容以編程方式添加一些文本框。在datagridviewcolomns上方設置搜索文本框

我坐列的大小從DataGrid:

int size = dataGridView1.Columns[i].Width; 

和GIF文本框大小相同:

TextBox box = new TextBox(); 
box.Width = size - 1; 

但文本框不匹配的columnsize的大小。 我看不出有什麼不順心

代碼:

public partial class DataTableFormSearch : Form 
{ 
    public DataTableFormSearch() 
    { 
     InitializeComponent(); 
     dataGridView1.DataSource = createTable(); 
     fillPanelWithSearch(); 
    } 

    public DataTable createTable() 
    { 
     DataTable dt = new DataTable(); 
     dt.Columns.Add("TestCol1", typeof(String)); 
     dt.Columns.Add("TestCol2", typeof(String)); 
     dt.Columns.Add("TestCol3", typeof(String)); 
     dt.Columns.Add("TestCol4", typeof(String)); 
     dt.Columns.Add("TestCol5", typeof(String)); 

     return dt; 
    } 

    public void fillPanelWithSearch() 
    { 
     flowLayoutPanel1.AutoSize = false; 
     for (int i = 0; i < dataGridView1.ColumnCount; i++) 
     { 

      TextBox box = new TextBox(); 
      box.Margin = Padding.Empty; 
      this.flowLayoutPanel1.Controls.Add(box); 
     } 
     resizeControls(); 
    } 

    public void resizeControls() 
    { 
     if (flowLayoutPanel1.Controls.Count > 0) 
     { 
      for (int i = 0; i < dataGridView1.ColumnCount; i++) 
      { 
       int size = dataGridView1.Columns[i].Width; 

       flowLayoutPanel1.Controls[i].Width = size; 
      } 
     } 
    } 

    private void DataTableFormSearch_SizeChanged(object sender, EventArgs e) 
    { 
     resizeControls(); 
    } 
} 

時,SizeChanged將的事件triggerd框更改爲正確的大小,而不是在對話框彈出

+0

的colomns是SAM e尺碼,所以無論我在這一刻是否是正確的colomn。 – Cageman

+0

Nop,在你的方式中,文本框應該大於datagridview,但它們不是(因爲我沒有權限添加圖像,所以我把它保存在這裏):http://imageshack.com/a/img28/2853/ hek0.png 但是我已經對我的程序做了一些改變,所以當它調整框的大小越來越小時,當我改變窗口的時候,所有的框都被設置在正確的列上方,以便代碼起作用。 *編輯上面的代碼* – Cageman

+1

你是否在構造函數中調用該方法?如果是這樣,不要。改用OnLoad()覆蓋方法。 – LarsTech

回答

1

嘗試移動你的方法在onload覆蓋,因爲DataGrdiView控制和它的列沒有正確的構造函數的過程尚未尺寸:

protected override void OnLoad(EventArgs e) { 
    base.OnLoad(e); 
    fillPanelWithSearch(); 
}