【问题标题】:How to make a ComboBox of a DataGridViewComboBoxColumn accept user new items?如何使 DataGridViewComboBoxColumn 的 ComboBox 接受用户新项目?
【发布时间】:2011-09-19 22:51:43
【问题描述】:

使用 DataGridViewComboBoxColumn,目标是使 ComboBoxes 接受用户的新项目以及选择已经存在的项目的可能性。

我知道使用 DataGridViewEditingControlShowing 事件来更改 DataGridViewComboBoxEditingControlDropDownStyle运行时间允许这样做,但我想知道这是否可以在较低级别完成。

我现在做的是扩展DataGridViewComboBoxColumnDataGridViewComboBoxCellDataGridViewComboBoxEditingControl,希望能改变EditingControl的DropDownStyle > 在我实例化它的那一刻。到目前为止,没有运气。

调试器显示正在执行正确的分配,但是,DropDownStyleEditingControlShowing 处弹出(使用该事件进行调试)作为 DropBoxList ,而不是 DropBox,这是意图。

以下是课程:

Public Class DataGridViewComboBoxColumnALT
    Inherits System.Windows.Forms.DataGridViewComboBoxColumn

    Public Sub New()
        Me.CellTemplate = New DataGridViewComboBoxCellALT
    End Sub
End Class

Public Class DataGridViewComboBoxCellALT
    Inherits System.Windows.Forms.DataGridViewComboBoxCell
    Public Overrides ReadOnly Property EditType() As Type
        Get
            Return GetType(DataGridViewComboBoxEditingControlALT)
        End Get
    End Property
End Class

Public Class DataGridViewComboBoxEditingControlALT
    Inherits System.Windows.Forms.DataGridViewComboBoxEditingControl
    Implements System.Windows.Forms.IDataGridViewEditingControl
    Public Sub New()
        MyBase.New()
        Me.DropDownStyle = ComboBoxStyle.DropBox
    End Sub
End Class

【问题讨论】:

    标签: vb.net datagridview datagridviewcombobox


    【解决方案1】:

    需要设置DataGridView.EditingControl的DropDownStyle @Inherted cell类的InitializeEditingControl方法

    class DataGridViewComboBoxCellExtended : DataGridViewComboBoxCell
    {
        public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
        {
            base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);            
            ((DataGridViewComboBoxEditingControlExtended)DataGridView.EditingControl).DropDownStyle = ComboBoxStyle.DropDown;
        }
        public override Type EditType
        {
            get
            {
                return typeof(DataGridViewComboBoxEditingControlExtended);
            }
        }
    

    【讨论】:

    • 要使用它,只需分配DataGridViewComboBoxColumn的模板,例如col.CellTemplate = new DataGridViewComboBoxCellExtended();(另外,DataGridViewComboBoxEditingControlExtended 不是必需的,可以使用DataGridViewComboBoxEditingControl 代替)。
    【解决方案2】:

    我与 DataGridViewComboBox 争论了很久。太可怕了。我最终使用了在运行时创建(非数据网格视图)组合框并将其浮动在网格上的旧技巧。

    【讨论】:

    • 有可能,谢谢,虽然我希望这个 DataGridView 中有数千个单元格,不是所有的 ComboBox,但仍然有很多定位。
    猜你喜欢
    • 2019-05-28
    • 1970-01-01
    • 2014-01-28
    • 2020-08-10
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多