当子控件的父级更改设计器中的可视属性时,如何通知子控件?

时间:2016-02-26 18:21:04

标签: c# .net winforms user-controls

我有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;
}

0 个答案:

没有答案