Альтернатива PropertyGrid?Пожалуйста, выслушай меня - PullRequest
4 голосов
/ 10 октября 2010

Я знаю, что это широкая тема, но, пожалуйста, выслушайте меня.

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

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

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

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

Единственная другая идея, которую я придумал самостоятельно (кроме отказа от чего-либо или извлечения чего-то нестандартного и некрасивого из System.Windows.Forms.Control), заключается в том, чтобы объединить все эти субконтроли в TableLayoutContainer. В основном это решает странную проблему с высотой, но я теряю функции заголовка и прокрутки в ListView.

Я искал альтернативу неделями и просто не могу ее найти. Все заново открыли сетку данных и список-как-сетку данных, даже коммерческие решения. Я не могу поверить, что не существует простой замены тому, что делает PropertyGrid. Мой ListView - лучший из плохих партий ... что еще я могу сделать?

Ответы [ 3 ]

3 голосов
/ 10 октября 2010

Попробуйте использовать TableLayoutPanel

Label l1 = new Label();
Label l2 = new Label();
Label l3 = new Label();
Label l4 = new Label();
l1.Text = "Name";
l2.Text = "Color";
l3.Text = "Quantity";
l4.Text = "Notes";
TextBox c1 = new TextBox();
ComboBox c2 = new ComboBox();
NumericUpDown c3 = new NumericUpDown();
TextBox c4 = new TextBox();
c2.Items.AddRange(new string[] { "Red", "Green", "Blue" });

//tableLayoutPanel1.GrowStyle = TableLayoutPanelGrowStyle.AddRows;
//tableLayoutPanel1.AutoScroll = true;
tableLayoutPanel1.AutoSize = true;
tableLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
tableLayoutPanel1.CellBorderStyle = TableLayoutPanelCellBorderStyle.Inset;
int rowIndex = 0;
tableLayoutPanel1.SuspendLayout();
foreach (Control[] pair in new Control[][] {
   new Control[] {l1, c1},
   new Control[] {l2, c2},
   new Control[] {l3, c3},
   new Control[] {l4, c4}})
{
   tableLayoutPanel1.Controls.AddRange(pair);
   if (tableLayoutPanel1.RowStyles.Count <= rowIndex)
      tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.AutoSize));
   else
      tableLayoutPanel1.RowStyles[rowIndex++].SizeType = SizeType.AutoSize;
}
tableLayoutPanel1.ResumeLayout();
1 голос
/ 10 октября 2010

У меня была твоя проблема дважды,

В первый раз я унаследовал от элемента управления ListBox и создал свой собственный элемент управления, это было непросто, у меня были некоторые проблемы с макетом, фокусировкой событий, колесом мыши и другими.

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

Я думаю, если мне снова понадобится элемент управления, я буду использовать сторонний элемент управления, их много, я думаю, у ComponentOne есть один,

Удачи.

1 голос
/ 10 октября 2010

Вы пробовали заменить сетку свойств VisualHint? Для информации, для гибкого связывания свойств DataTable может быть очень полезен, если вы не хотите изучать внутренности system.componentmodel

...