Dana Bell Ответов: 3

Как получить доступ к переменным в дочерней форме MDI (с лентой)?


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

Мои дочерние формы включают в себя список, который заполняется из списка< t>. При изменении данных для отображения я обычно меняю список< t> и устанавливаю источник данных ListBox так, чтобы он указывал на список.

Что я уже пробовал:

Я пытался сделать их общедоступными и пытался использовать аксессоры.

Обходной путь, который я использую, состоит в том, чтобы использовать дочерний элемент управления формой (метку) и изменить его. Затем дочернее свойство xxChanged элемента управления выполняет соответствующее действие. Единственное, что код все еще находится в ребенке.

Разве нет коллекции (как в элементах управления) переменных в дочерней форме, к которой я могу обратиться?

Graeme_Grant

Что вы пробовали до сих пор?

Dave Kreskowiak

Почему МДИ?? Он уже давно мертв.

Режим MDI в Windows Forms предназначался для нескольких окон редактора документов. Например, блокнот, который может открывать и редактировать несколько файлов одновременно. Если что-то подобное не то, что вы делаете, MDI-плохой выбор.

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

Dana Bell

Да, я действительно хочу МДИ. У меня будет несколько дочерних окон, каждое с разными данными, и я хотел бы, чтобы они были заперты в главном окне программ, а не разбросаны по рабочему столу. Вы можете увидеть мультиформную версию по адресу http://www.tylerhosting.com/hoot/help/.

Подклассы-это то, к чему я начинаю двигаться. Это будет утомительно, так как формы имеют различную степень сходства. Я предполагал, что смогу построить еще один уровень наследования.

3 Ответов

Рейтинг:
2

Ravi Bhavnani

Я думаю, что вы подходите к этой проблеме неправильно.

Если вы хотите повторно использовать код, который заполняет элемент управления списком из коллекции или источника данных, абстрагируйте эту функциональность в метод нового вспомогательного класса (например, ListViewHelper) следующим образом:

public static PopulateListView<br />
    (ListView listView,<br />
     IEnumerable<MyDataObject> dataObjects)
и вызывать этот метод в различных Formс.

/ Рави


Dana Bell

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

С
Список & lt;hookset> resultSet;
Списка lstResults;

Я использую команды
resultSet = Гудок.Крючки.get_Hooks(поиск, LexWords.hootData); // поиск
или resultSet = letterFilter.Бросание&ЛТ;hookset и GT;().Заказатьпо(слово =&ГТ; слово.Метод toString()).ToList (); / / сортировка

затем
lstResults.Источник данных = результирующий набор;

Остальная часть кода изменяет метки и тому подобное. Поскольку я не могу выполнять команды в Родительском файле, я думаю, что сейчас лучшая идея-это набор унаследованных форм.

Ravi Bhavnani

& gt; унаследованные формы.
Ай, ай, ай. Это будет зависеть от того, что ваша унаследованная форма будет иметь метки с тем же именем, что и родительская форма. Наследование функциональности пользовательского интерфейса-это прекрасно, но наследование необработанного пользовательского интерфейса ужасно из-за ограничений, которые он накладывает на именование. Если вы хотите наследовать форму, пусть ваш унаследованный метод будет универсальным - то есть пусть он принимает элемент управления Label в качестве аргумента (в отличие от предположения, что дочерняя форма имеет метку с именем "lblFoo").

/ Рави

Dana Bell

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

Рейтинг:
1

Graeme_Grant

Поиск в Google - ваш друг... Быстрый поиск выделяет множество возможных результатов, которые могут вам помочь. Вы пробовали провести какое-нибудь исследование?


Dana Bell

Да. Я искал пару часов. Я нашел, как получить доступ к дочерним элементам управления, как отправить данные в дочернюю форму, как получить доступ к родительским. Ничего о доступе к дочерним переменным формы (т. е. спискам).

Рейтинг:
0

Dana Bell

Хотя я не нашел способа прямого доступа к переменным в дочерней форме, я нашел способ выполнить код в дочерней форме с ленты.

1. Создайте метку на дочерней форме

2. Сделайте его общедоступным (или защищенным)

3. Добавьте событие TextChanged для метки

4. Найдите и измените текст метки на ленте.