如何抓住从子控件的事件在WinForms应用程序用户的控制?(How do I grab event

2019-09-01 13:40发布

有没有什么办法的主要形式是能够拦截事件在用户控件上的子控件烧成?

我有嵌在我的应用程序的主要形式的自定义用户控件。 控制包含操作数据,其本身是由其他控制显示在主表上的各种子控件。 我想,如果是的主要形式可能以某种方式通知,当用户更改子控件,这样我就可以更新数据和其他相应的显示。

现在,我作弊。 我迷上了子控件的焦点离开事件的委托。 此委托更改我不使用其他地方(在此原因,的CausesValidation)的用户控件的属性。 然后,我有主窗体上定义的委托时的用户控制的变化,这然后指示该应用更新数据和显示CausesValidation属性。

会出现一个问题,因为我也有一个委托成立时,焦点离开用户控制,因为我需要验证在用户控制的领域之前,我可以允许用户做任何事情。 但是,如果用户仅仅是子控件之间切换,我不想验证,因为他们可能无法进行编辑。

基本上,我希望当用户切换子控件或离开的用户控件中的数据进行更新,但无法验证。 当用户离开控件,我想更新和验证。 眼下,留给用户控制的原因验证射击两次。

Answer 1:

最好的做法是在揭露事件的UserControl是泡沫事件到父窗体。 我已经取得了进展,并放在一起的例子给你。 这里是什么这个例子中提供的说明。

  • UserControl1
    • 创建一个UserControlTextBox1
    • 注册在一个公开活动UserControl称为ControlChanged
    • 内的UserControl注册了一个事件处理程序TextBox1 TextChangedEvent
    • TextChangeEvent处理函数我所说的ControlChanged事件泡到父窗体
  • Form1
    • 掉落的一个实例UserControl1设计者
    • 注册一个事件处理程序UserControl1MouseLeaveControlChanged

这里是说明了一个屏幕截图ControlChanged ,我所定义的事件UserControl是在Visual Studio中的父Windows窗体上可通过UX。

事件处理程序的用户控制http://friendfeed.s3.amazonaws.com/0d5a3968cb785625c8afb3974a8d84894c476291



Answer 2:

对于这样的事情最好的模式将创建在用户控件自定义事件,并在适当的时期,使他们。

你的情况是相当复杂的,但不是闻所未闻的。 (实际上,我在我目前的一个项目非常类似的模式。)我接近它的方式是,用户控件负责其自身的验证。 我不使用的CausesValidation; 在代替适当的用户的控制点,通过我的ValidateChildren覆写执行验证()。 (当用户点击“保存”或“下一步”用户控件,对我来说这通常发生。)

不熟悉你的用户控制界面,这可能不是100%适合你的方法。 但是,如果引发自定义事件(可能与指定是否执行验证定制的EventArgs),你应该在哪里你想成为能够得到。



Answer 3:

您将需要线了你在乎你的用户控件中捕获的事件,并通过对用户的控制自身的一些自定义的事件属性发布。 一个简单的例子是包装一个按钮单击事件:

// CustomControl.cs
// Assumes a Button 'myButton' has been added through the designer

// we need a delegate definition to type our event
public delegate void ButtonClickHandler(object sender, EventArgs e);

// declare the public event that other classes can subscribe to
public event ButtonClickHandler ButtonClickEvent;

// wire up the internal button click event to trigger our custom event
this.myButton.Click += new System.EventHandler(this.myButton_Click);
public void myButton_Click(object sender, EventArgs e)
{
  if (ButtonClickEvent != null)
  {
    ButtonClickEvent(sender, e);
  }
}

然后,在使用该控件的形式,连线了事件,就像您任何其他:

// CustomForm.cs
// Assumes a CustomControl 'myCustomControl' has been added through the desinger
this.myCustomControl.ButtonClickEvent += new System.EventHandler(this.myCustomControl_ButtonClickEvent);
myCustomControl_ButtonClickEvent(object sender, EventArgs e)
{
  // do something with the newly bubbled event
}


Answer 4:

如果有人仍然不知道如何模拟事件在winform冒泡的方法Application.AddMessageFilter是看的好地方。

使用这种方法,你可以安装自己的过滤器,其监视所有的消息被发布到当前线程的消息队列。

你应该知道,发送邮件(不贴)不能被该过滤器处理。 Fourtounatly,最有趣的事件(如点击事件)和发布不发送,因此可以被该过滤器监控



Answer 5:

我想帮腔,如所描述的,它实际上听起来像你追一个红鲱鱼。 虽然它看上去你必须在缺乏事件的WinForms鼓泡是造成你麻烦的情况,实际情况是,一个贫穷的架构强迫你需要将事件冒泡时,你不应该。

如果你能重构/重组你的设计使得控制与通用数据模型的工作(MVC / MVP是显而易见的选择),那么你可以简单地套用在模型上常见的WinForms图案像的PropertyChanged事件告诉你的主要形式和任何其他控件从而消耗该数据来更新自己。

总之,其他的答案是,他们回答这个问题是问合理。 但是,从代码质量的角度来看,我认为更好的答案是从UI中分离数据。



文章来源: How do I grab events from sub-controls on a user-control in a WinForms App?