如何设置自定义 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
}
这不是您的代码需要的唯一修复。链接的文章只是一个简单的例子,您还应该考虑其他一些要点::
- 您的自定义单元格应具有与自定义列相同的属性。编辑控件也应具有相同的属性。
- 在您的自定义列中,在 getter 个属性中,您应该从
CellTemplate
中获取 属性 值。
- 在自定义列的 setter 属性中,将 属性 值设置为
CellTemplate
,同时使用for
循环,因为用户期望列设置适用于所有单元格。
- 在您的自定义单元格中,您需要覆盖
Clone
并确保执行自定义单元格属性的深度复制。但是由于您将 属性 值存储在单元格模板中,因此您无需为自定义列覆盖 Clone
。克隆对设计师很重要。
- 在您的自定义单元格中,您应该在
InitializeEditingControl
中使用自定义单元格的属性设置编辑控件。还要保留对编辑控件的引用,并在单元格属性的 setter 中更新编辑控件的属性,因为如果 属性 列更改,用户希望看到编辑控件的更改。
- 在您的自定义编辑控件中,您需要处理由更改值引发的事件(这里是您的情况
OnTextChanged
),然后通知 DataGridView
该单元格已变脏使用this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
你可以看到我在ComboBox
栏目相关的源代码中提到的规则:
我创建了一个用户控件并为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
}
这不是您的代码需要的唯一修复。链接的文章只是一个简单的例子,您还应该考虑其他一些要点::
- 您的自定义单元格应具有与自定义列相同的属性。编辑控件也应具有相同的属性。
- 在您的自定义列中,在 getter 个属性中,您应该从
CellTemplate
中获取 属性 值。 - 在自定义列的 setter 属性中,将 属性 值设置为
CellTemplate
,同时使用for
循环,因为用户期望列设置适用于所有单元格。 - 在您的自定义单元格中,您需要覆盖
Clone
并确保执行自定义单元格属性的深度复制。但是由于您将 属性 值存储在单元格模板中,因此您无需为自定义列覆盖Clone
。克隆对设计师很重要。 - 在您的自定义单元格中,您应该在
InitializeEditingControl
中使用自定义单元格的属性设置编辑控件。还要保留对编辑控件的引用,并在单元格属性的 setter 中更新编辑控件的属性,因为如果 属性 列更改,用户希望看到编辑控件的更改。 - 在您的自定义编辑控件中,您需要处理由更改值引发的事件(这里是您的情况
OnTextChanged
),然后通知DataGridView
该单元格已变脏使用this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
你可以看到我在ComboBox
栏目相关的源代码中提到的规则: