Windows窗体DataGridView控件在同一列中具有不同的控件类型

时间:2009-06-12 11:46:48

标签: c# winforms datagridview

是否可以在DataGridView中执行以下操作:

在同一列中,我想更改DataGridViewTextBoxColumn和DataGridViewComboBoxColumn之间每行的控件类型?

(这是因为有时我想显示一个下拉列表,有时我只想让用户输入一个写意值。)

谢谢,

P.S。我正在使用C#

3 个答案:

答案 0 :(得分:9)

我最近有一个类似的用例,最后写了类似下面的代码:

编写一个自定义的Cell和Column类,并覆盖单元格上的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添加一列,并使用正确的编辑控件。

答案 1 :(得分:0)

您可以创建一个包含两个控件的模板列,隐藏您不想要的控件,并将另一个绑定到代码中的数据源。

答案 2 :(得分:0)

您可以创建自己继承自DataGridViewCell的类,并覆盖适当的虚拟成员(InitializeEditingControls,EditType,也许还有其他几个)。然后,您可以使用此类的实例作为单元格模板

创建DataGridViewColumn