1 Востаннє редагувалося Betterthanyou (11.01.2020 11:54:28)

Тема: custom component як змінити значення властивості Text

Не можу змінити властивість Text у класі який успадковується від класу Button (стандартний клас кнопки).
Після запуску програми з'являється стандартний надпис "Button1"

public class ButtonX : Button
{
    public ButtonX()
    {
        Size = new Size(36, 36); // - Працює
        Image = Resources.Close; // - Працює
        Text = "Custom Text"; // - Не працює (Виводиться стандартний текст Button1)
    }
}

Як можна змінити властивість Text ?

2

Re: custom component як змінити значення властивості Text

А як саме ви створюєте примірник цього ButtonX?
І вирівняйте код, будь ласка.

Подякували: leofun01, Betterthanyou2

3 Востаннє редагувалося leofun01 (11.01.2020 20:08:27)

Re: custom component як змінити значення властивості Text

Betterthanyou написав:
Text = "Custom Text"; // - Не працює (Виводиться стандартний текст Button1)

Зверніть увагу

Text = "Custom Text"; // - Працює (Властивості Text присвоюється стрічка "Custom Text")

Властивість Text не виводить текст на екран (цим займається метод OnPaint). Text зберігає стрічку, яка (можливо) потім буде виведена.
Очевидно, ви змінюєте значення властивості десь між викликом конструктора ButtonX() і викликом OnPaint. Перегляньте файли *.Designer.cs якщо вони існують.

Подякували: koala, Betterthanyou2

4

Re: custom component як змінити значення властивості Text

leofun01 - так, я не знав. Думав що завжди конструктори спрацьовують перші. Спробував замінити текст перед ОнПеінт подією - тепер виводить правильно

        protected override void OnPaint(PaintEventArgs pe)
        {
            Text = "Text";
            base.OnPaint(pe);
        }
koala написав:

А як саме ви створюєте примірник цього ButtonX?

Перетягую з toolbox на форму

5

Re: custom component як змінити значення властивості Text

Betterthanyou написав:

Думав що завжди конструктори спрацьовують перші.

Вони дійсно спрацьовують перші. Тобто щось замінює текст на Button1 після конструктора.

Betterthanyou написав:

Спробував замінити текст перед ОнПеінт подією - тепер виводить правильно

        protected override void OnPaint(PaintEventArgs pe)
        {
            Text = "Text";
            base.OnPaint(pe);
        }

OnPaint викликається кожного разу при перемалюванні форми. Хоч би в OnCreate поставили.

Betterthanyou написав:
koala написав:

А як саме ви створюєте примірник цього ButtonX?

Перетягую з toolbox на форму

Ну так у налаштуваннях і напишіть потрібний текст.

Подякували: Betterthanyou, leofun012

6

Re: custom component як змінити значення властивості Text

Це не принципово, але як зробити так щоб зміни з текстом застосовувалися до компонента одразу після перетягнення його на форму ? (я пробував гуглити, але нічого не знайшов)
Зараз з OnCreateControl кнопка працює так - я витягаю компонент на форму, компонент створюється з стандартним текстом. Після запуску програми він виводиться такий як я вказав.

koala написав:

Ну так у налаштуваннях і напишіть потрібний текст.

Я роблю компонент для C#. Ідея така що це буде кнопка "закрити" з стандартною картинкою "Х" і без тексту

7 Востаннє редагувалося koala (13.01.2020 18:56:43)

Re: custom component як змінити значення властивості Text

Тоді приберіть це поле з доступних для візуального редактора.

Подякували: leofun011

8 Востаннє редагувалося leofun01 (13.01.2020 19:16:39)

Re: custom component як змінити значення властивості Text

Betterthanyou написав:

як зробити так щоб зміни з текстом застосовувалися до компонента одразу після перетягнення його на форму ?

За це відповідає System.ComponentModel.DefaultValueAttribute.
Приклад використання :

public class MyButton : Button
{
    public MyButton() { }

    [DefaultValue("MyButton")]
    public override string Text {
        get { return base.Text; }
        set { base.Text = value; }
    }
}

Після цього треба буде скомпілювати проект, щоб MyButton появився в списку компонент і перетягнути його на форму. Ви побачите, що текст кнопки буде мати вигляд
myButton1


Але якщо ви хочете, щоб текст зовсім не можна було змінити, то можна так :

public class MyButton : Button
{
    public MyButton() { base.Text = "Some Text"; }

    [Browsable(false)]
    [DefaultValue("Some Text")]
    public override string Text {
        get { return "Some Text"; }
        set { }
    }
}

Тоді після компіляції і перетягування на форму завжди буде текст
Some Text

koala написав:

Тоді приберіть це поле з доступних для візуального редактора.

System.ComponentModel.BrowsableAttribute

Подякували: koala, Betterthanyou2