Я хочу, чтобы базовые элементы управления формы, такие как текстовое поле, кнопка, метка, имели одинаковые пользовательские методы
Я обнаружил, что нет базового класса, который находится непосредственно под:
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.