代码之家  ›  专栏  ›  技术社区  ›  Jonathan Escobedo

使用继承表单控件的好处

  •  0
  • Jonathan Escobedo  · 技术社区  · 16 年前

    我试图从一个基本的Windows窗体创建新的组件,但在使用ToolStrip组件时发现了一些困难,例如:

    如何使用父工具栏上按钮(单击)的事件在子窗体上绑定datagrid.datasource?

    我必须在每个孩子的表格上用一些片段来做这个,顺便问一句为什么?

    // btnSearch
    // 
    this.btnSearch.Click += new System.EventHandler(this.btnExec_Click);
    
    private void btnExec_Click(object sender, EventArgs e)
    {
    //do stuff
    }
    

    谢谢

    编辑:我还知道修改器问题:

    alt text http://i30.tinypic.com/2dchaw2.jpg

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

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

    我需要添加一个简单的工具条,在我的基本窗体上有一些工具条控件,但是设计器不允许我正确地使用这些控件(我不能以将事件从工具条按钮路由到我的子窗体为例)

    2 回复  |  直到 16 年前
        1
  •  1
  •   Fredrik Mörk    16 年前

    当您创建一个继承另一个包含不同控件的窗体时,没有自动挂接的事件处理程序。相反,您需要像在代码示例中那样做。另一种方法是在基窗体中附加该事件处理程序,然后让基窗体公开您可以监听的事件。例子:

    在基本形式中:

    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 事件(您可以使用属性网格中的事件列表执行此操作),或者可以重写 OnExecInvoked 方法:

    protected override void OnExecInvoked(EventArgs e)
    {
        base.OnExecInvoked(e);
    
        // do what the form should do when Exec is invoked
    }
    

    通过这种方式,您已经封装了基窗体的内部,这样子窗体就不知道引发事件的控件的类型(它甚至可能是导致引发同一事件的多个不同控件),但基窗体仍然提供了一个清晰的点,子窗体可以在该点上做出反应。

        2
  •  1
  •   Pavel Minaev    16 年前

    为了能够更改属性并订阅从父窗体(或UserControl)继承的控件的事件,父窗体应该设置这些控件' Modifiers 属性到 protected (或者,通常为任何值,以便为父窗体中的控件生成的字段对子窗体可见)。的默认值 修饰语 private .

    推荐文章