2010-10-09 1 views
4

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

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

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

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

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

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

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

+0

«Я не могу использовать PropertyGrid, потому что у меня не всегда есть экземпляр»: что вы имеете в виду? – 2010-10-09 20:54:17

+0

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

ответ

1

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

+0

Я думаю, это примерно так же близко, как и я. Я предпочел какой-то пример бесплатного исходного кода, но он по крайней мере превосходит $ 1000 + для продукта ComponentOne. – Ryan

3

Попробуйте использовать 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(); 
+0

Я попробовал, хорошая работа, я думаю, что это будет более полезно, если он будет инкапсулирован с помощью CustomControl. – Homam

1

Я имел проблему дважды,

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

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

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

Удачи.

Смежные вопросы