C # Использование формы для загрузки других пользовательских элементов управления и доступа к базовому элементу управления или свойству - PullRequest
3 голосов
/ 29 августа 2011

В настоящее время у меня есть программа на C # с формой Windows, а затем шаблон пользовательского элемента управления, помещенный в форму.Шаблон пользовательского контроля действительно используется в качестве заполнителя.У меня есть ряд других элементов управления, которые наследуются от этого шаблона пользовательского элемента управления.

Каждый из этих элементов управления имеет кнопки навигации, такие как «Продолжить» и «Назад», и каждый элемент управления знает, какой элемент управления должен быть загружен следующим.Однако мне нужно выяснить, как проще иметь переменные, которые являются глобальными для этих элементов управления.

Единственный обходной путь, который у меня есть, - это то, что я передаю форму каждому элементу управления, когда они загружаются, и использую переменные внутри формы для чтения и записи.Как правильно построить каждый из этих пользовательских экранов управления из базового элемента управления, содержащего объекты, на которые могут попасть все элементы управления?

Извините за бессвязный характер поста, но я думал об этой проблеме все утро.

Вот часть кода:

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

Код для начальной загрузки элемента управления из щелчка формы:

        conTemplate1.Controls.Clear();
        conInbound Inbound = new conInbound(this);
        Inbound.Dock = DockStyle.Fill;
        Inbound.Anchor = (AnchorStyles.Left | AnchorStyles.Top);
        conTemplate1.Controls.Add(Inbound);

Код для продолжениякнопка внутри одного из элементов управления:

    if ((Parent.Controls.Count - 1) <= Parent.Controls.IndexOf(this))
        {
            UserControl nextControl = new conPartialClear();
            nextControl.Dock = DockStyle.Fill;
            Parent.Controls.Add(nextControl);
            this.Hide();
            Parent.Controls[Parent.Controls.IndexOf(this) + 1].Show();
        }
        else
        {
            this.Hide();
            Parent.Controls[Parent.Controls.IndexOf(this) + 1].Show();
        }

Ответы [ 2 ]

2 голосов
/ 29 августа 2011

Лучшей практикой для общения от элемента управления к родителю является использование событий, а для связи от родителя к элементу управления - вызов методов.

Однако, если вы не хотите или не можете следовать этой практике, вот что я бы порекомендовал.

Каждый UserControl имеет свойство ParentForm, которое возвращает форму, содержащую элемент управления. Если вы знаете, что UserControl всегда будет присоединен к MyParentForm, вы просто разыгрываете ParentForm, и тогда вы можете получить доступ ко всем публичным элементам управления, методам и т. Д.

Вот что я имею в виду:

public class conTemplate
{
    public MyParentForm MyParentForm
    {
        get
        {
            return (MyParentForm)this.ParentForm;
        }
    }
}

Таким образом, вы можете легко получить доступ к любым публичным членам MyParentForm. Ваш класс conInbound может иметь такой код, как this.MyParentForm.GlobalSettings.etc..., и даже может иметь доступ к любому общедоступному элементу управления.

0 голосов
/ 29 августа 2011

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

По сути, для продолжения вашего UC у вас будет событие, которое срабатывает при нажатии. Вы захотите справиться с этим в своей форме. Я не совсем уверен в синтаксисе из памяти, или я бы кое-что решил для вас с точки зрения кода. Но я думаю, что это тот путь, по которому ты захочешь. Думайте о своем UC как о любом другом элементе управления окнами. Если вы добавляете кнопку в форму, вы назначаете ей метод события. Сделайте то же самое с UC.

Я нашел это и подумал, что это может быть полезно. Прокрутите вниз, где говорится о UC и событиях. http://www.akadia.com/services/dotnet_user_controls.html

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ после новой информации от OP.

Вы можете объявить глобальную переменную внутри UC типа yourForm и затем установить эту переменную в ParentForm во время выполнения, если я правильно вас понимаю.

Итак, внутри вашего UC-класса вы можете сделать:

private parentFormInstance;

тогда внутри конструктора UC вы можете установить его так:

parentFormInstance = this.ParentForm; (или каково бы ни было имя свойства).

Это позволяет вам во время разработки использовать:

parentFormInstance.DoSomething();

без компилятора, кричащего на вас.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...