2015-09-02 206 views
-1

我不是很有經驗的Windows窗體工作。我有一個特定的要求,那就是我想向DataGridView添加行,並且這些列有一個ComboBox或一個文本框。任何人都可以請指導我如何將「控制」列添加到DataGridView行。所以基本上我應該能夠添加與我的控件一樣多的行.Combo框也是級聯的。動態添加組合框/文本框到DataGridView Windows窗體C#

謝謝。

回答

1

你可以做什麼:

  • 添加一個組合框
  • 更改此列的每一行的值

你不能做什麼:

  • 對於多行有不同的ColumnTypes

這意味着:

你不能決定應該使用列的類型每一行。當你需要特定行的組合框時,你不能將它添加到包含所有隻需要textboxcolumns的行的datagridview。

你可以做的是:

在運行時,有一個叫DataGridView.GetCellDisplayRectangle memberfunction。通過這種方法,您可以在運行時獲得特定單元格的界限。讓我們想象你只有在這一個特定的行上應用組合框。這裏的方案:

void OnSelectionChanged(Object sender, ChangedEventArgs e){ 
    if(DataGridView1.CurrentCell.RowIndex == 4){ 
     // Show one single ComboBox in the specified Cell in the Row 4 (actually Row 3 because RowIndex is zero-based) 

     if(this.Controls.Contains(ComboBox1)) 
      this.Controls.Remove(ComboBox1); 

     ComboBox ComboBox1 = gcnew ComboBox(); 
     // Define the properties of your combobox: 
     ComboBox1.Text = "Choose an Option..."; 
     ComboBox1.AutoSize = false; // Important, because you will change the size programmatically 
     // ... 


     // Get the boundaries of the desired cell 
     Rectangle CellBounds = DataGridView1.GetCellDisplayRectangle(
      /*ColumnIndex*/ 1, 
      /*RowIndex*/ DataGridView1.CurrentCell.RowIndex, 
      /*CutOverflow*/ false); 

     // By applying size and location to the combobox you make sure it is displayed on the cell 
     ComboBox1.Size = CellBounds.Size; 
     ComboBox1.Location = CellBounds.Location; 

     // Add the ComboBox to your Controls in order to get it rendered when your window is shown 
     this.Controls.Add(ComboBox1); 
} 

現在你的組合框顯示在你GetCellDisplayRectangle(ColumnIndex, RowIndex, CutOverflow)指定的細胞。當然,這個代碼可以進一步優化,因爲每次您選擇另一個單元格時,都會創建一個新的組合框並添加到您的控件容器中。在多次選擇後,這將有利地使用大量內存。但它會起作用。

+0

嗯謝謝你的回覆。大多數時候,除了一列可以是組合框列或文本框列,並且這取決於在某列的組合框中選擇的值,所有行的列將具有相同的類型。 –

+0

@ V.B好吧,通過上面提供的代碼,您可以輕鬆完成您的需求。正如我想你知道如何檢索其他行中單元格的值,可以將這些決定添加到代碼中。 –