【问题标题】:Observe event created through an instance of a Winforms UserControl观察通过 Winforms UserControl 实例创建的事件
【发布时间】:2010-12-07 07:49:24
【问题描述】:

在我的 winforms 应用程序中,我有一个包含 DataGridView 的 UserControl。我在需要时将这个 UserControl 实例化并加载到我的主窗体 (frmMain) 中的面板中。我的问题是弄清楚如何响应或监听在我的 UC 的 DataGridView 中引发的事件。例如,我想在主窗体中处理 DataGridView 的 CellDoubleClick 事件,而不是通过 UC。

这可能吗?我曾想过在双击网格中的单元格时更新一个属性,然后让我的主窗体在该属性更改时执行任何操作 - 因此我想到了使用 INotifyPropertyChanged。但是,我对如何在 m 场景中使用它并没有太多了解,并且非常感谢这方面的一些帮助,或者如果有人可以提出替代解决方案。

非常感谢!

【问题讨论】:

    标签: events datagridview user-controls winforms


    【解决方案1】:

    谢谢你 4 你的回复。很抱歉没有早点回复。我确实设法通过在我的 UC 中创建一个公共事件来解决这个问题:

    public event DataGridViewCellEventHandler GridRowDoubleClick {
        add { dgvTasks.CellDoubleClick += value; }
        remove { dgvTasks.CellDoubleClick -= value; }
    }
    

    在我的主窗体中,在我实例化并加载 UC 之后

    _ucTask.GridRowDoubleClick += new DataGridViewCellEventHandler(TasksGrid_CellDoubleClick);
    

    附带以下事件:

    private void TasksGrid_CellDoubleClick( object sender, DataGridViewCellEventArgs e ) {
        // do work here!
    }
    

    这确实有效,尽管我不知道你们中的任何专家是否预见到这种方法会出现问题。

    【讨论】:

    • 这与我在第 2 点中所写的相同,很高兴了解我们都采用这种方法独立 =)。
    【解决方案2】:

    您的用户控件必须封装一些逻辑,因此如果您想按照您描述的方式处理控件中的 DataGridView 的事件,您可能在用户控件和封装方面缺少一些东西。从技术上讲,这里有两种方法可以做到这一点:

    1. 在 DataGridView 类型的用户控件中创建公共属性。
    2. 制作事件包装器。您需要在用户控件中创建一个事件,该事件在 DataGridView CellDoubleClick(或任何)被触发时引发,并且在您的调用代码中您将处理此事件包装器。

    第二种方法更合乎逻辑,因为您的控件的内部逻辑是封装的,您可以为组件的最终用户提供比 CellDoubleClidk 或其他方式更合乎逻辑和更有意义的事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 2016-09-19
      • 1970-01-01
      • 2012-12-20
      相关资源
      最近更新 更多