如何设置自定义 DataGridViewColumn 的自定义 EditingControl 的属性

How to set properties of custom EditingControl of a custom DataGridViewColumn

我创建了一个用户控件并为TextBox添加了更多功能,我将这个用户控件绑定到一个DataGridViewColumn。但是我不知道如何访问用户控制的自定义属性。

我是如何遵循教程的https://msdn.microsoft.com/en-us/library/7tas5c80.aspx?PHPSESSID=o1fb21liejulfgrptbmi9dec92

public class IntegerCell : DataGridViewTextBoxCell
{
    //Implementations
}

public class IntegerColumn : DataGridViewColumn
{
    public IntegerColumn()
        :base(new IntegerCell())
    {

    }

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

    [Browsable(true)]
    [Category("Custom")]
    [Description("")]
    [DisplayName("Max. Value")]
    public int MaxValue { get; set; }

    [Browsable(true)]
    [Category("Custom")]
    [Description("")]
    [DisplayName("Min. Value")]
    public int MinValue { get; set; }
}

public partial class IntegerEditingControl : IntegerTextBox, IDataGridViewEditingControl
{
    //Implementations
}

public class IntegerTextBox : TextBox
{
    [Browsable(true)]
    [Category("Custom")]
    [Description("")]
    [DisplayName("Max. Value")]
    public int MaxValue { get; set; }

    [Browsable(true)]
    [Category("Custom")]
    [Description("")]
    [DisplayName("Min. Value")]
    public int MinValue { get; set; }
}

public partial class Form1 : Form
{
    private DataGridView dataGridView1 = new DataGridView();

    public Form1()
    {
        InitializeComponent();
        this.dataGridView1.Dock = DockStyle.Fill;
        this.Controls.Add(this.dataGridView1);
        this.Load += new EventHandler(Form1_Load);
        this.Text = "DataGridView column demo";
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        IntegerColumn col = new IntegerColumn();
        this.dataGridView1.Columns.Add(col);
        this.dataGridView1.RowCount = 5;

        int i = 0;
        foreach (DataGridViewRow row in this.dataGridView1.Rows)
        {
            row.Cells[0].Value = i++;
        }
    }
}

我想将 DataGridView 自定义列的设置值传递给用户控件属性。

要解决此问题,您需要对代码应用多个修复程序,但作为一般答案,自定义单元格的 InitializeEditingControl 方法是您应该配置编辑控件的地方。您应该覆盖 InitializeEditingControl 以访问编辑控件并能够设置它的属性。

public override void InitializeEditingControl(int rowIndex, object 
    initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{
    base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
    YourEditingControl c = DataGridView.EditingControl as YourEditingControl;
    //Set c.Properties here
}

这不是您的代码需要的唯一修复。链接的文章只是一个简单的例子,您还应该考虑其他一些要点::

  1. 您的自定义单元格应具有与自定义列相同的属性。编辑控件也应具有相同的属性。
  2. 在您的自定义列中,在 getter 个属性中,您应该从 CellTemplate 中获取 属性 值。
  3. 在自定义列的 setter 属性中,将 属性 值设置为 CellTemplate,同时使用for 循环,因为用户期望列设置适用于所有单元格。
  4. 在您的自定义单元格中,您需要覆盖 Clone 并确保执行自定义单元格属性的深度复制。但是由于您将 属性 值存储在单元格模板中,因此您无需为自定义列覆盖 Clone。克隆对设计师很重要。
  5. 在您的自定义单元格中,您应该在 InitializeEditingControl 中使用自定义单元格的属性设置编辑控件。还要保留对编辑控件的引用,并在单元格属性的 setter 中更新编辑控件的属性,因为如果 属性 列更改,用户希望看到编辑控件的更改。
  6. 在您的自定义编辑控件中,您需要处理由更改值引发的事件(这里是您的情况 OnTextChanged),然后通知 DataGridView 该单元格已变脏使用this.EditingControlDataGridView.NotifyCurrentCellDirty(true);

你可以看到我在ComboBox栏目相关的源代码中提到的规则: