Вопрос по c#, winforms, user-controls – Пользовательский элемент управления, полученный из события Component - OnCreate?

2

Я создал простой пользовательский элемент управления, производный от класса Component:

public partial class TrialChecker : Component
{
    private int _trialDays;


    public int TrialDays
    {
        get { return _trialDays; }
        set { _trialDays = value;}
    }

    public TrialChecker()
    {
        InitializeComponent();

        MessageBox.Show(TrialDays.ToString());

    }

    public int GetTrialDays()
    {
        return _trialDays;
    }
}

Этот элемент управления будет использоваться для реализации пробной функциональности в моем приложении. Приложение (до его запуска) должно проверить оставшиеся дни пробной версии и отобразить диалоговое окно уведомления, содержащее оставшиеся дни пробной версии и текстовое поле для записи ключа разблокировки.

Но я хочу минимизировать количество кода, необходимого для записи при использовании этого элемента управления. Итак, моя идея состоит в том, чтобы поместить код пробной проверки в мой элемент управления и - сразу после создания элемента управления он должен отображать оставшиеся дни.

Пробный период (свойство TrialDays) устанавливается в конструкторе пользователя, и он должен быть доступен для использования, только если создан более качественный элемент управления. Как вы можете видеть, я попытался поместить это в конструктор, но это не работает, потому что конструктор вызывается перед установкой TrialDays в значение valueje, введенное в конструкторе пользователя. И MessageBox всегда отображает значение по умолчанию 0.

Нет событий OnLoad или OnCreate, которые нельзя переопределить. Итак, как я могу автоматически проверить пробный статус, используя значение, введенное в конструкторе?

Ваш Ответ

1   ответ
4

он просто предоставляет способ размещения компонента в форме во время разработки, предоставляя доступ к его свойствам с помощью окна Properties. Но он не имеет заметных полезных событий, использование компонента требует явного кода в форме. Как и OpenFormDialog, с ним ничего не происходит, пока вы не вызовете его метод ShowDialog ().

Конструктор можно использовать, но, к сожалению, он запускается слишком рано. Свойство DesignMode сообщает, работает ли компонент во время разработки, но еще не установлен во время конструктора. Вам нужно будет задержать код, и это сложно, потому что нет других методов или событий, которые запускаются позже.

Решение состоит в том, чтобы использовать события формы, в которую вы поместили компонент. Как и событие Load. Это требует некоторого легкого кода, чтобы убедить дизайнера рассказать вам о форме. Этот метод используется компонентом ErrorProvider, он требует предоставления свойства типа ContainerControl и переопределения метода установки свойства Site. Как это:

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Windows.Forms;

public partial class Component1 : Component {
    private ContainerControl parent;

    [Browsable(false)]
    public ContainerControl ContainerControl {
        get { return parent; }
        set {
            if (parent == null) {
                var form = value.FindForm();
                if (form != null) form.Load += new EventHandler(form_Load);
            }
            parent = value;
        }
    }

    public override ISite Site {
        set {
            // Runs at design time, ensures designer initializes ContainerControl
            base.Site = value;
            if (value == null) return;
            IDesignerHost service = value.GetService(typeof(IDesignerHost)) as IDesignerHost;
            if (service == null) return;
            IComponent rootComponent = service.RootComponent;
            this.ContainerControl = rootComponent as ContainerControl;
        }
    }

    void form_Load(object sender, EventArgs e) {
        if (!this.DesignMode) {
            MessageBox.Show("Trial");
        }
    }
}

Код непостижим, но вы можете быть уверены, что он надежен и стабилен, потому что это то, что использует компонент ErrorProvider. Обязательно вызовите Environment.Exit () после окончания пробного периода, исключение не будет работать хорошо.

Я обнаружил, что определение события LayOut для компонента, а затем проверка DesignTime == false ... в этот момент я могу получить доступ к компоненту, как он отображается во время выполнения ... полезно.

Похожие вопросы