2009-06-12 99 views
7

是否有可能做一個DataGridView如下:Windows窗體DataGridView控件有不同的控制類型在同一列

在同一列我想改變DataGridViewTextBoxColumn和DataGridViewComboBoxColumn之間每行的控制型?

(這是因爲有時我想顯示一個下拉列表和其他時間,我只想讓用戶輸入一個手繪值)。

謝謝,

P.S.我正在使用C#

+0

非常好的問題。在使用DataGridView類時,直到遇到此問題纔是時間問題。 – TheBlastOne 2011-10-13 08:22:53

回答

0

您可以創建自己的繼承自DataGridViewCell的類,並覆蓋足夠的虛擬成員(InitializeEditingControls,EditType,或許還有其他幾個)。然後,您可以創建一個的DataGridViewColumn這一類作爲細胞模板

+0

謝謝你。看起來像正確的軌道。不幸的是,我對此很陌生,無論我做什麼,我都無法讓細胞出現。我建議覆蓋EditType。如果我從說'DataGridViewTextBoxCell'繼承,那麼我可以看到從'DataGridViewCell'繼承的單元格,並且覆蓋EditType以返回typeof(DataGridViewTextBoxEditingControl)給了我一個空白單元格 - 儘管我可以看到該列。我相信有一些明顯的我錯過了。 – 2009-06-12 15:55:50

0

您可以使用兩個控件創建模板列,隱藏不需要的控件,並將其他控件綁定到代碼中的數據源。

+0

模板列是ASP.NET GridView,而不是WinForms DataGridView ... – 2009-06-12 12:04:12

+0

啊,我的壞。我從事WinForms工作已有一段時間了。 – atfergs 2009-06-12 14:40:08

7

我最近也有類似的用例的一個實例,最後寫類似下面的代碼:

編寫自定義單元格和列級,並覆蓋單元上的EditType和InitializeEditingControl方法酌情返回不同的控件(在這裏我只是數據綁定與.useCombo場自定義類的列表指出哪些控件使用):

// Define a column that will create an appropriate type of edit control as needed. 
public class OptionalDropdownColumn : DataGridViewColumn 
{ 
    public OptionalDropdownColumn() 
     : base(new PropertyCell()) 
    { 
    } 

    public override DataGridViewCell CellTemplate 
    { 
     get 
     { 
      return base.CellTemplate; 
     } 
     set 
     { 
      // Ensure that the cell used for the template is a PropertyCell. 
      if (value != null && 
       !value.GetType().IsAssignableFrom(typeof(PropertyCell))) 
      { 
       throw new InvalidCastException("Must be a PropertyCell"); 
      } 
      base.CellTemplate = value; 
     } 
    } 
} 

// And the corresponding Cell type 
public class OptionalDropdownCell : DataGridViewTextBoxCell 
{ 

    public OptionalDropdownCell() 
     : base() 
    {   
    } 

    public override void InitializeEditingControl(int rowIndex, object 
     initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle) 
    { 
     // Set the value of the editing control to the current cell value. 
     base.InitializeEditingControl(rowIndex, initialFormattedValue, 
      dataGridViewCellStyle); 

     DataItem dataItem = (DataItem) this.OwningRow.DataBoundItem; 
     if (dataItem.useCombo) 
     { 
      DataGridViewComboBoxEditingControl ctl = (DataGridViewComboBoxEditingControl)DataGridView.EditingControl; 
      ctl.DataSource = dataItem.allowedItems; 
      ctl.DropDownStyle = ComboBoxStyle.DropDownList; 
     } 
     else 
     { 
      DataGridViewTextBoxEditingControl ctl = (DataGridViewTextBoxEditingControl)DataGridView.EditingControl; 
      ctl.Text = this.Value.ToString(); 
     } 
    } 

    public override Type EditType 
    { 
     get 
     { 
      DataItem dataItem = (DataItem)this.OwningRow.DataBoundItem; 
      if (dataItem.useCombo) 
      { 
       return typeof(DataGridViewComboBoxEditingControl); 
      } 
      else 
      { 
       return typeof(DataGridViewTextBoxEditingControl); 
      } 
     } 
    } 
} 

然後,只需將一列添加到此類型的DataGridView中,並且正確的編輯控件應該是u SED。

相關問題