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

时间:2017-01-27 02:18:53

标签: c# winforms datagridview datagridviewcolumn

我创建了一个usercontrol并为TextBox添加了更多函数,我将此usercontrol绑定到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自定义列的set set值传递给usercontrol属性。

1 个答案:

答案 0 :(得分:2)

要解决此问题,您需要对代码应用多个修复程序,但作为一般答案,您应该在自定义单元格的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. 在自定义列中,在属性设置器中,将属性值设置为CellTemplate,还使用for循环为列的所有单元格设置属性值,因为用户希望列设置适用所有细胞。
  4. 在自定义单元格中,您需要覆盖Clone并确保执行自定义单元格属性的深层副本。但是,由于您将属性值存储在单元格模板中,因此您无需为自定义列覆盖Clone。克隆对设计师来说很重要。
  5. 在自定义单元格中,在InitializeEditingControl中,您应使用自定义单元格的属性设置编辑控件。还要保留对编辑控件的引用,并在单元格的属性设置器中更新编辑控件的属性,因为如果列的属性发生更改,用户希望在编辑控件上看到更改。
  6. 在自定义编辑控件中,您需要处理通过更改值(在您的案例中为OnTextChanged)引发的事件,然后使用{{通知DataGridView单元格已被弄脏1}}
  7. 您可以在与this.EditingControlDataGridView.NotifyCurrentCellDirty(true);列相关的源代码中看到我提到的规则: