Как управлять WinForm с тоннами наборов переменных входных текстовых полей? - PullRequest
2 голосов
/ 18 июля 2011

Я пишу форму C # для добавления различных записей в базу данных.Существует около 15 различных типов записей.Все типы записей имеют несколько общих свойств, таких как имя, дата, комментарии и т. Д. Кроме того, все типы записей имеют около 10 других уникальных свойств для этого типа.

Чтобы избежать написания 15 отдельных формпо одному для каждого типа записи. Я пытаюсь сделать все это в одной форме.

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

Я считаю, что должен быть лучший способ сделать это.Это на самом деле немного медленно на моей машине, и моя машина имеет четырехъядерный процессор!Visual Studio даже немного медлителен при сохранении этой формы.

Существуют ли приличные способы создания этих динамических наборов полей во время выполнения?

Ответы [ 6 ]

2 голосов
/ 18 июля 2011

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

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

1 голос
/ 19 июля 2011

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

Вероятно, лучше создать 15 подформ (без полей, TopLevel = false, dock = fill), а затем загрузить подформу при выборе вкладки:

private subform _subForm1 = null;
private subform _subForm2 = null;

private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
  if (e.TabPage.Name == tabPage1.Name)
  {
    if (_subForm1 == null)
    {
      _subForm1 = new subform();
      tabPage1.Controls.Add(_subForm1);
      _subForm1.Show();
    }
  }
  else if (e.TabPage.Name == tabPage2.Name)
  {
    if (_subForm2 == null)
    {
      _subForm2 = new subform();
      tabPage2.Controls.Add(_subForm2);
      _subForm2.Show();
    }
  }

Для общих полей, общих для этих форм, я бы создал usercontrol.

0 голосов
/ 20 июля 2011

Хорошо, я думаю, что нашел очень элегантное решение для этого.

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

Однако я столкнулся с проблемами, когда захотел добавить, например, Label и TextEdit. Label и TextEdit оба следовали за потоком, вместо того, чтобы Label находился поверх TextEdit. Для метки есть свойство, которое вы можете включить или выключить в зависимости от того, должно ли оно нарушать поток. Я занимался этим до тех пор, пока не стало очевидно, что будет болезненно скрывать и показывать как Метку, так и TextEdit, к которому идет Метка, когда мне нужно было переключать различные состояния формы. (каждое состояние должно отображать или скрывать различный выбор доступных полей ввода)

Итак, я создал общий пользовательский элемент управления с двумя панелями, прикрепленными к обеим, чтобы они соответствующим образом изменили размеры. Верхняя панель содержит элемент управления Label. В этом базовом пользовательском элементе управления с меткой я создал открытое свойство для редактирования текста метки. Затем, чтобы приспособиться к различным типам ввода формы, я создал несколько пользовательских элементов управления, которые наследуются от базового элемента управления с меткой. В эти дочерние элементы управления я поместил необходимые поля ввода - TextEdit, ComboEdit, DateEdit и т. Д. Каждый дочерний элемент управления имеет открытые свойства для получения и установки значений в соответствующих элементах управления вводом.

Теперь это так же просто, как добавить множество различных пользовательских элементов управления «LabeledField», которые я сделал, в FlowLayoutPanel, и они корректируются по назначению. Теперь я могу показать или скрыть только те, которые мне нужны, и я не повторяю код для всех различных состояний формы! Это похоже на предложение Дениса Биондика, за исключением того, что я использую не форму, а пользовательский элемент управления. Я не думаю, что лично рекомендую для этого использовать форму, поэтому я даю свой собственный ответ.

0 голосов
/ 19 июля 2011

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

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

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

Надеюсь, я ясно выразился.

С уважением.

0 голосов
/ 18 июля 2011

Я бы посоветовал посмотреть на ленивую загрузку других вкладок, возможно, с помощью вызова ajax при нажатии на вкладку, чтобы вернуть весь html для вкладки. Подобный подход к сохранению данных также был бы полезен. Возможно, вы даже захотите сделать это для первой вкладки.

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

0 голосов
/ 18 июля 2011

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

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