我有UserControl
来托管DataGridView
组件,其中包含标题和一个数据行。
当我的容器更改设计器中的某些可视属性时,我遇到了尝试通知DataGridView的问题。
我覆盖基本UserControl的BackColor属性,以设置网格中数据行的BackColor。目标是当我设置UserControl的容器的BackColor时,它将逐渐下降到Grid。
如果我显式设置UserControl的BackColor属性,则设计和运行时DataGridControl会正确跟随。
如果我只是改变容器中的BackColor,那就是我在运行时工作,但在设计时是间歇性的。
删除容器上的控件,数据行BackColor遵循容器颜色。
更改容器的BackColor不会调用UserControl的属性设置器来更改设计器中的数据行。
更改容器会改变我在label
上使用TableLayoutPanel
创建的其他自定义组件。我没有设置所有标签以匹配容器,所以它必须使用属性设置器才能正确。如果我在属性设置器中放置MessageBox.Show("Setter Called");
,它们并不总是会发生。在工作或目标非工作控制中。
当我运行项目时,可执行文件会更改要匹配的行。作为奖励,设计师颜色在可执行文件显示后立即改变,即使在我结束程序后它仍保持匹配颜色。
我还在UserControl上尝试了ParentChanged事件,但只在程序运行时调用它,或者我从表单中添加或删除控件。就像其他属性一样。切勿在IDE中更改容器。
使用Load事件使代码在RunTime上运行。
当前代码:
public JobPanel()
{
InitializeComponent();
this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
dataGridView1.RowCount = 1;
dataGridView1.BorderStyle = System.Windows.Forms.BorderStyle.None;
}
[BrowsableAttribute(true)]
public override Color BackColor { get { return base.BackColor; } set { SetBackColor(value); } }
private void SetBackColor(Color value)
{
if (BackColor != value) { //Makes no difference if we remove this test
base.BackColor = value;
if (dataGridView1 != null) {
dataGridView1.Rows[0].DefaultCellStyle.BackColor = BackColor;
dataGridView1.Rows[0].DefaultCellStyle.SelectionBackColor = BackColor;
}
}
}
private void JobPanel_Load(object sender, EventArgs e)
{
dataGridView1.DefaultCellStyle.BackColor = base.BackColor;
dataGridView1.DefaultCellStyle.ForeColor = base.ForeColor;
}