Разширете System.Windows.Forms.Button и променете текста по подразбиране в c#

Създадох потребителски контролен бутон чрез разширяване на класа System.Windows.Forms.Button.

Зададох стандартните .Text .Width и .Height в конструктора на новия клас.

Когато пусна тази контрола върху формуляр, IDE е достатъчно интелигентна, за да обърне внимание на Width и Height, посочени в конструктора, и да присвои тези свойства на новия бутон, който се създава, но игнорира свойството Text и присвоява .Text на бутонът да бъде "ucButtonConsumables1"

Има ли начин да задам .Text на стойност по подразбиране по мой избор?

public partial class ucButtonConsumables : System.Windows.Forms.Button {
    public ucButtonConsumables() {

        this.Text = "Consumables";                   
        this.Width = 184;
        this.Height = 23;

        this.Click += new EventHandler(ucButtonConsumables_Click);

    }

    void ucButtonConsumables_Click(object sender, EventArgs e) {

        MessageBox.Show("Button Clicked")

    }

}

person timothy    schedule 29.03.2012    source източник
comment
Стартирахте ли програмата и проверихте дали текстът е това, което имахте предвид? чувствам, че проверявате това в дизайнера, не би трябвало да е така, когато бихте го стартирали   -  person V4Vendetta    schedule 29.03.2012
comment
Опитвате се да се борите с персонализирания дизайнер за бутон. Да спечелиш тази битка не е лесно, опитваш се да направиш нещо много необичайно. Няма смисъл да давате един и същ текст на всеки бутон.   -  person Hans Passant    schedule 29.03.2012
comment
Да - определено се боря с дизайнера. Дизайнерът присвоява име на контролата и иска да присвои свойството .Text да бъде същото.   -  person timothy    schedule 05.04.2012


Отговори (3)


Скриване на свойството Text от сериализацията на дизайнера:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public override string Text
{
    get { return base.Text; }
    set { base.Text = value; }
}

Или създайте дизайнер със стойности по подразбиране:

public class ConsumablesButtonDesigner : System.Windows.Forms.Design.ControlDesigner
{
    public override void OnSetComponentDefaults()
    {
        base.OnSetComponentDefaults();
        Control.Text = "Consumables";
    }
}

И предоставете този дизайнер на вашия бутон:

[Designer(typeof(ConsumablesButtonDesigner))]
public class ucButtonConsumables : Button
{
   //...
}
person Sergey Berezovskiy    schedule 29.03.2012
comment
Първата опция се нуждае от компилация, за да обнови текста по подразбиране на бутона. - person Sergey Berezovskiy; 29.03.2012
comment
Вторият метод по-горе работи много добре. Първият метод, включително чисто възстановяване и т.н., не работи за мен, но вероятно би с постоянство. - person timothy; 05.04.2012
comment
@timothy, за да работи първият метод, трябва да компилирате проект. След компилирането текстът на дизайнера по подразбиране ще бъде заменен от вашия - person Sergey Berezovskiy; 05.04.2012

Трябва да замените свойството Text в производен клас, за да промените.

public override string Text { get; set; }
person Bilal Hashmi    schedule 29.03.2012
comment
При просто замяна на свойството стойността няма да бъде зададена. Когато контролата се зареди, свойството Text ще бъде нулирано. - person Prakash; 29.03.2012

Да, не е възможно да го направите в конструктора. Ако сте сигурни, че стойността няма да бъде променена отново, направете го по този начин. Замяна на свойството Text и връщане на константата.

    public override string Text
    {
        get
        {
            return "Consumables";
        }
        set
        {
        }
    }
person Prakash    schedule 29.03.2012