使用继承表单控件的好处

时间:2009-09-03 18:46:25

标签: c# winforms design-patterns

我尝试从一个基本Windows窗体创建新组件,我在使用工具条组件时遇到了困难,例如:

如何使用父工具条上的按钮(点击)中的事件绑定子表单上的datagrid.datasource?

我必须在每个子表单上使用一些片段来执行此操作,顺便说一下?

// btnSearch
// 
this.btnSearch.Click += new System.EventHandler(this.btnExec_Click);

private void btnExec_Click(object sender, EventArgs e)
{
//do stuff
}

由于

编辑:我也知道修饰符问题:

alt text

我的意思是,我必须用一个公共按钮替换toolstripbutton,还必须在设计器类(基本表单)上添加更多代码:

grpCommonControls.Height = 20;
dtTScomponent = new ToolStripControlHost(grpCommonControls);
dtTScomponent.Alignment = ToolStripItemAlignment.Right;
toolStrip1.Items.Add(dtTScomponent);


tssbExporta.Alignment = ToolStripItemAlignment.Left;
toolStrip1.Items.Add(tssbExporta);

我需要在我的基本表单上添加一个带有一些工具条控件的简单工具条,但设计师不允许我正确使用这些工具(我不能将事件从toolstripbutton路由到我的子表单作为示例)

2 个答案:

答案 0 :(得分:1)

为了能够更改属性并订阅从父Form(或UserControl)继承的控件事件,父表单应将这些控件的“Modifiers属性设置为protected”(或者,一般情况下) ,以任何值为父表单中的控件生成的字段对子表单可见。 Modifiers的默认值为private

答案 1 :(得分:1)

当您创建一个继承包含不同控件的另一个表单的表单时,不会自动为您连接事件处理程序。相反,您需要像在代码示例中那样执行此操作。另一种方法是在基本表单中附加该事件处理程序,然后让基本表单公开您可以侦听的事件。例如:

以基本形式:

public event EventHandler ExecInvoked;
private void btnExec_Click(object sender, EventArgs e)
{
     OnExecInvoked(e);
}

protected virtual void OnExecInvoked(EventArgs e)
{
    EventHandler evt = ExecInvoked;
    if (evt != null)
    {
        evt(this, e);
    }
}

然后,在您继承的表单中,您可以为ExecInvoked事件设置事件处理程序(您可以使用属性网格中的事件列表来执行此操作),也可以覆盖{{1方法:

OnExecInvoked

这样你就封装了基本表单的内部,这样子表单不知道引发事件的控件类型(它甚至可能是几个不同的控件导致同一事件被引发),但是基本形式仍然提供一个明确的点,儿童形式可以对其作出反应。