Windows窗体DataGridView控件有不同的控制类型在同一列
是否有可能做一个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