是否有可能做一個DataGridView如下:Windows窗體DataGridView控件有不同的控制類型在同一列
在同一列我想改變DataGridViewTextBoxColumn和DataGridViewComboBoxColumn之間每行的控制型?
(這是因爲有時我想顯示一個下拉列表和其他時間,我只想讓用戶輸入一個手繪值)。
謝謝,
P.S.我正在使用C#
是否有可能做一個DataGridView如下:Windows窗體DataGridView控件有不同的控制類型在同一列
在同一列我想改變DataGridViewTextBoxColumn和DataGridViewComboBoxColumn之間每行的控制型?
(這是因爲有時我想顯示一個下拉列表和其他時間,我只想讓用戶輸入一個手繪值)。
謝謝,
P.S.我正在使用C#
您可以創建自己的繼承自DataGridViewCell的類,並覆蓋足夠的虛擬成員(InitializeEditingControls,EditType,或許還有其他幾個)。然後,您可以創建一個的DataGridViewColumn這一類作爲細胞模板
謝謝你。看起來像正確的軌道。不幸的是,我對此很陌生,無論我做什麼,我都無法讓細胞出現。我建議覆蓋EditType。如果我從說'DataGridViewTextBoxCell'繼承,那麼我可以看到從'DataGridViewCell'繼承的單元格,並且覆蓋EditType以返回typeof(DataGridViewTextBoxEditingControl)給了我一個空白單元格 - 儘管我可以看到該列。我相信有一些明顯的我錯過了。 – 2009-06-12 15:55:50
您可以使用兩個控件創建模板列,隱藏不需要的控件,並將其他控件綁定到代碼中的數據源。
模板列是ASP.NET GridView,而不是WinForms DataGridView ... – 2009-06-12 12:04:12
啊,我的壞。我從事WinForms工作已有一段時間了。 – atfergs 2009-06-12 14:40:08
我最近也有類似的用例的一個實例,最後寫類似下面的代碼:
編寫自定義單元格和列級,並覆蓋單元上的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。
非常好的問題。在使用DataGridView類時,直到遇到此問題纔是時間問題。 – TheBlastOne 2011-10-13 08:22:53