我希望文本框、按钮、标签等基本表单控件具有相同的自定义方法

Posted

技术标签:

【中文标题】我希望文本框、按钮、标签等基本表单控件具有相同的自定义方法【英文标题】:I want basic Form controls like textbox, button, label to have the same custom methods 【发布时间】:2015-12-09 19:27:23 【问题描述】:

我发现没有直接在下面的基类:

Textbox, Label and Button

这些是它们的定义:

public class TextBox : TextBoxBase
public abstract class TextBoxBase : Control

public class Button : ButtonBase, IButtonControl
public abstract class ButtonBase : Control

public class Label : Control

在 .net #region Assembly System.Windows.Forms,版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089 // C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5\System.Windows.Forms.dll

我需要覆盖刷新按钮并为每个控件添加一些自定义属性和一些自定义事件处理程序。 因此我决定创建一个自定义控件。 但那是在我意识到并非每个类都直接从 Control 扩展之前。 我知道我可以使用接口至少强制方法/属性在合同中,但我希望能够为这些“自定义”方法编写一次代码,而不是每次扩展接口时。

还有其他方法吗?

这是自定义 Control 类和我想要继承的所需功能。 幻想是我会做这样的事情:

public class TextBox : Sgctrl(当然是幻想,因为我的方式是不可能的,如下所示)

public class SGctrl : Control


    public String MySystem_SourceField  get; set;  

    protected Core ctrlCore  get; set; 


    protected MyForm.Forms.Location.FormLoc callingForm;
    // the delegate
    public delegate void Published_DELEGATE_TYPE_MySysConnectedControlRefresh(object aSGctrl, SGRefreshHandler sgr);

    // This event instance of the delegate provides a hook for .NET as it makes it show up in the properties->events
    // and by doubleclicking it allows other specific (textbox/label) visibility;enabled properties to be set
    // 
    public event Published_DELEGATE_TYPE_MySysConnectedControlRefresh MySysConnectedControlRefresh_handler;


    //protected virtual void OnMySysSGcontrolRefresh(SGRefreshHandler e)
    protected virtual void OnMySysSGcontrolRefresh(SGRefreshHandler e)
    
        if (MySysConnectedControlRefresh_handler != null)
                                             //signature SGctrl , eventhandler object
         MySysConnectedControlRefresh_handler(this, e); 
    

    //public SGctrl(bool refreshable,Form SGcallingForm)
    public SGctrl()
    

    

    // will do it in the refresh method


    public override void Refresh()
    
        base.Refresh();

        // if calling from and core reference are not yet initialized do so
        if (this.callingForm == null)
            this.callingForm = (MyForm.Forms.Location.FormLoc)this.TopLevelControl;

        if (this.ctrlCore == null)
            this.ctrlCore = this.callingForm.getCoreRef();

        // pass to suscriber
        //core.getField("cllabloc1");    
        //sgctrl.Text = sgctrl.core.getField(sgctrl.MySystem_SourceField) // get MySys data

        if (this.GetType()==typeof(TextBox)) // if need to know type of control
         

        this.Text=this.ctrlCore.getField(this.MySystem_SourceField);
        SGRefreshHandler SGRefrshrobj = new SGRefreshHandler(this);
        OnMySysSGcontrolRefresh(SGRefrshrobj);
    

【问题讨论】:

【参考方案1】:

你需要继承你需要扩展的控件:

public class SGTextBox : TextBox, ISGctrl 


现在,ISGctrl 是一个接口,它定义了在 SGTextBox 中添加或覆盖的自定义属性和方法。

【讨论】:

是的,但是通过使用接口,我将不得不在每个自定义控件上重写我的处理程序。我想写一次代码主体。 我想我想要实现的是为所有提到的基本控件编写一次自定义代码(“处理程序”)。 通过一个界面,我必须为每个控件重写代码。唯一的好处是继承让我可以检查以确保我包含了我的处理程序和我的 .refresh 覆盖以及我的自定义属性。 通过接口可以编写扩展方法一次性添加自定义代码。 感谢夏普忍者。我对扩展方法的唯一问题是有些是委托,我得到以下错误:因为我不能把它作为第一个参数 public static delegate void Published_DELEGATE_TYPE_MySysConnectedControlRefresh(object aSGctrl, SGRefreshHandler sgr);【参考方案2】:

你也可以创建泛型

public class SGctrl<T> : where T:Control

//extencion go here

【讨论】:

以上是关于我希望文本框、按钮、标签等基本表单控件具有相同的自定义方法的主要内容,如果未能解决你的问题,请参考以下文章

iOS_book 02 - 基本交互(约束视图控制器基本控件:按钮文本框分段控件开关标签图像控件)

C#自定义控件内多个控件的单击事件

Visual C#中用户控件的用途是什么?

如何验证复合控件

Bootsrtap表单

更多控件具有相同的tabindex时的Tab顺序?