Я хочу, чтобы базовые элементы управления формы, такие как текстовое поле, кнопка, метка, имели одинаковые пользовательские методы

Я обнаружил, что нет базового класса, который находится непосредственно под:

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)\ Справочные сборки \Microsoft\Framework.NETFramework\v4.5\System.Windows.Forms.dll

Мне нужно было переопределить кнопку обновления, а также добавить некоторые пользовательские свойства и некоторые пользовательские обработчики событий для каждого элемента управления. Поэтому я решил создать собственный элемент управления. Но это было до того, как я понял, что не каждый класс напрямую расширен из Control. Я знаю, что могу использовать интерфейс, чтобы, по крайней мере, обеспечить соответствие методов / свойств контракту, но я хочу иметь возможность писать код для этих "пользовательских" методов один раз, а не каждый раз, когда я расширяю интерфейс.

Есть ли другой способ?

Это пользовательский класс Control и желаемая функциональность, которую я хочу унаследовать. Фантазия в том, что я бы сделал что-то вроде этого:

открытый класс 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);
    }
}

2 ответа

Также вы можете создать общий

public class SGctrl<T> : where T:Control
{
//extencion go here
}

Вы должны унаследовать от элементов управления, которые необходимо расширить:

public class SGTextBox : TextBox, ISGctrl 
{
}

Теперь ISGctrl - это интерфейс, который определяет пользовательские свойства и методы для добавления или переопределения в SGTextBox.

Другие вопросы по тегам