代码之家  ›  专栏  ›  技术社区  ›  Wildhorn

C获取自定义控件内控件的事件

  •  3
  • Wildhorn  · 技术社区  · 15 年前

    我在自定义控件内有一个列表框。我将此自定义控件用于窗体。我希望在表单中工作时能够获得ListBox索引更改事件。我该怎么做?

    4 回复  |  直到 15 年前
        1
  •  3
  •   Hans Passant    15 年前

    这可能是用户控件的缺点。必须重新发布事件及其一个或多个嵌入控件的属性。考虑另一种选择:如果这个用户控件只包含一个列表框,那么您最好从列表框继承而不是从用户控件继承。

    总之,您需要重新启动SelectedIndexChanged事件。当然,您需要能够让客户机代码读取当前选定的项目。因此:

    public partial class UserControl1 : UserControl {
        public event EventHandler SelectedIndexChanged;
    
        public UserControl1() {
            InitializeComponent();
        }
    
        private void listBox1_SelectedIndexChanged(object sender, EventArgs e) {
            EventHandler handler = SelectedIndexChanged;
            if (handler != null) handler(this, e);
        }
        public object SelectedItem {
            get { return listBox1.SelectedItem; }
        }
    }
    
        2
  •  4
  •   Grzenio    15 年前

    如果您使用的是WinForms,则需要手动连接此事件。在自定义控件上使用相同的签名创建事件,在自定义控件内的原始列表框上为偶数创建一个处理程序,并在此处理程序中激发新创建的事件。(如果使用WPF,则忽略所有这些)

        3
  •  3
  •   Arne    15 年前

    可以向自定义控件添加代理事件

    public event EventHandler<WhatEverEventArgs> IndexChanged { 
        add { listBox.IndexChanged += value; }
        remove { listBox.IndexChanged -= value; } 
    }
    
        4
  •  0
  •   Jake Kalstad    15 年前

    查看ninjects扩展messagebroker,并在index changed上引发一个已发布的事件,然后在表单端订阅该事件。

    在大多数情况下,MessageBroker非常有用。

    另一种想法是实现一个观察者模式,并将表单作为观察者添加到控件事件中。