如何在C#中重写WinForm UserControl中的方法和事件?

社区首页 >问答首页 >如何在C#中重写WinForm UserControl中的方法和事件?问如何在C#中重写WinForm UserControl中的方法和事件?ENStack Overflow用户提问于 2010-11-16 21:47:34回答 3查看 7.5K关注 0票数 4我在C# WinForms中有一个名为BaseControl的自定义控件,还有一个名为Selected的属性。

我希望在基控件中有一个事件SelectedChanged和虚拟方法OnSelecteChanged,对于许多属性,即Click事件和OnClick方法,它们的行为方式应该与我们在Control类中的方式相同。

这意味着从我的BaseControl派生的任何人都可以绑定到该事件,也可以重写OnSelectedChanged方法。

因此,当Selected属性值发生变化时,应该触发事件,如果方法被重写,则控制应该转到该方法。

我知道如何触发事件,但不知道如何使用方法。

请指引我。

c#关注问题分享EN回答 3推荐最新Stack Overflow用户回答已采纳发布于 2010-11-16 21:55:23

下面是应该如何实现事件的示例:

代码语言:javascript复制public class BaseControl : Control

{

private object _selected;

public object Selected

{

get { return _selected; }

set

{

if (!Equals(_selected, value))

{

_selected = value;

OnSelectedChanged(EventArgs.Empty);

}

}

}

public event EventHandler SelectedChanged;

protected virtual void OnSelectedChanged(EventArgs e)

{

if (SelectedChanged != null)

SelectedChanged(this, e);

}

}在此示例中,您可以在被覆盖的类中覆盖OnSelectedChanged,如下所示:

代码语言:javascript复制public class MyControl : BaseControl

{

protected override void OnSelectedChanged(EventArgs e)

{

base.OnSelectedChanged(e);

// My own logic.

}

}收藏分享票数 3ENStack Overflow用户发布于 2010-11-16 21:55:42

代码语言:javascript复制private bool _selected;

public bool Selected

{

get { return _selected; }

set

{

if (value != _selected)

{

_selected = value;

OnSelectedChanged();

}

}

}

public event EventHandler SelectedChanged;

protected virtual void OnSelectedChanged()

{

var handler = SelectedChanged;

if (handler != null)

handler(this, EventArgs.Empty);

}收藏分享票数 1ENStack Overflow用户发布于 2010-11-16 21:52:58

基本上,您不会从Selected属性设置器中触发事件-而是调用方法,然后让方法调用事件。任何重写该方法的人都应该调用base.OnSelectedChanged,以确保事件仍然会触发。因此,您的方法应该如下所示:

代码语言:javascript复制protected virtual void OnSelectedChanged(EventArgs e) {

EventHandler handler = Selected; // Or your own delegate variable

if (handler != null) {

handler(this, e);

}

}收藏分享票数 0EN页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持原文链接:https://stackoverflow.com/questions/4194782

复制相关文章

Copyright © 2088 2008世界杯_2026世界杯举办地 - mwllb.com All Rights Reserved.
友情链接