【问题标题】:Exposing events of underlying control暴露底层控制的事件
【发布时间】:2010-07-22 15:40:28
【问题描述】:

我在自定义控件中有一个组合框。如何将其中的特定事件(例如 SelectedIndexChanged 或 KeyPress 等)公开给实现我的自定义控件的任何人/事物?

【问题讨论】:

    标签: c# winforms user-controls


    【解决方案1】:

    你可以这样转发事件:

        public event EventHandler SelectedIndexChanged 
        {
            add { inner.SelectedIndexChanged += value; }
            remove { inner.SelectedIndexChanged -= value; }
        }
    

    【讨论】:

    • 很好,不知道这样的语法可用于 C# 中的事件。所以你也可以在那里添加副作用,我猜是事件处理程序的分配和删除(例如,如果你想自己处理/维护它们,或者需要使用 COM 或本机代码,甚至在发生这些情况时使用硬件)
    • 您需要注意这一点,因为事件的发送者不是外部控件而是内部控件。这可能是意图,但在某些情况下这可能是不可取的。
    • 这可能适用于组合框的 SelectedIndexChanged,但需要更多代码来处理其他事件,例如复选框的 CheckedChanged。使用与上面类似的代码将使您的语法接近价值,而答案#2可能更适合这种情况
    • @gg89:不;这将适用于任何可能的事件。您可能有错误的委托类型;阅读错误信息。
    • 可能是我的类型错误,但使用 controlhost 派生工具条项目的推荐方法在 msdn.microsoft.com/en-us/library/… 的示例中
    【解决方案2】:

    您需要自己将这些编码到控件中 - 用户控件不会自动提升其子控件的事件。然后,您可以将您的实际控件交叉连接到用户控件的提升事件:

            public event EventHandler SelectedIndexChanged;
    
            private void OnSelectedIndexChanged(object sender, EventArgs e)
            {
                if (SelectedIndexChanged != null)
                    SelectedIndexChanged(sender, e);
            }
    
            public UserControl1()
            {
                InitializeComponent();
    
                cb.SelectedIndexChanged += new EventHandler(OnSelectedIndexChanged);
            }
    

    很遗憾,您需要为您感兴趣的每个活动都这样做。

    【讨论】:

      【解决方案3】:

      一个非常简单的解决方案,而不是自定义事件,将嵌套控件公开为自定义控件的属性。从那里您可以很容易地将事件处理程序附加到它。公开子控件并不总是可取的,但根据控件类型和您使用它的方式,它可能会起作用。

      //create an instance of my control
      MyCustomControl controlInstance = new MyCustomControl();
      
      //attach and event handler to the exposed subcontrol
      controlInstance.SaveButton.Click += new EventHandler(SaveButton_Click);
      

      【讨论】:

      • 这并没有错,但是对于那些不精通创建自定义用户控件的读者来说,应该注意的是,不建议公开子控件的原因之一是它破坏了许多预期将完整的功能封装在用户控件中的目的。通过公开整个子控件,您实际上是在鼓励用户控件使用者直接操作子控件。相反,请尝试公开用户控件的使用者绝对需要的一两个事件,而不是整个子控件。
      【解决方案4】:

      还有另一种方法可以通过设计器来处理:

      在设计器上,在您的自定义控件中,在“设计”下的组合框属性上,将“修改器”设置为内部。

      然后在你需要做些什么的地方添加:

      CustControlName.YourCombo.SelectedIndexChanged += YourCombo_SelectedIndexChanged;
      

      还有:

      private void YourCombo_SelectedIndexChanged(object sender, EventArgs e)
      { 
          // Code to execute when the SelectedIndexIsChanged goes here
      }
      

      【讨论】:

      • 工作更方便一些,但仍需接受 CobaltBlue 的评论
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-16
      • 1970-01-01
      • 1970-01-01
      • 2018-06-19
      • 2012-08-01
      • 1970-01-01
      相关资源
      最近更新 更多