Как настроить сортировку категорий в PropertyGrid?
-
05-07-2019 - |
Вопрос
Как настроить сортировку категорий в PropertyGrid
?
Если я выберу одно из следующих ...
propertyGrid.PropertySort = PropertySort.Categorized;
propertyGrid.PropertySort = PropertySort.CategorizedAlphabetical;
... тогда категории будут в алфавитном порядке. («Алфавитный» может показаться применимым к свойствам в каждой категории.) Если я использую PropertySort.NoSort
, я теряю категоризацию. Р>
Я заполняю свой PropertyGrid
SelectObject
, что довольно просто:
this.propertyGrid1.SelectedObject = options;
options
- это экземпляр класса с соответствующим образом оформленными свойствами:
[CategoryAttribute("Category Title"),
DisplayName("Property Name"),
Browsable(true),
ReadOnly(false),
BindableAttribute(true),
DesignOnly(false),
DescriptionAttribute("...")]
public bool PropertyName {
get {
// ...
}
set {
// ...
this.OnPropertyChanged("PropertyName");
}
}
У меня есть несколько дюжин свойств в полдюжине категорий. Р>
Можно ли каким-то образом настроить порядок сортировки по категориям, сохранив удобство использования с SelectedObject
? Р>
Решение
Если вы имеете в виду, что вы хотите, чтобы категории сортировались определенным (не алфавитным) способом, то нет - я не думаю, что вы можете сделать это. Возможно, вы захотите попробовать VisualHint - я полагаю, он действительно есть (поскольку вы можете захватить гораздо больше контроля).
Другие советы
Я думаю, что эта ссылка полезна http://bytes.com/groups/ нетто-с / 214456-д-упорядочивание-сортировочной-категория-текст PropertyGrid
Я не верю, что есть способ сделать это. Единственное, что я мог найти, что означает, что вы могли бы сделать это, PropertySort имущество. Если вы установите его в none, он говорит, что свойства отображаются в порядке их получения из дескриптора типа. Вы, возможно возможность создать дескриптор типа прокси между вашим объектом и PropertyGrid, который будет возвращать не только свойства в правильном порядок, но свойства с категориями в том порядке, который вы хотите их в ...
Как сказал @Marc Gravel в своем ответе , в рамках нет ничего, что позволяло бы такое поведение. Любое решение будет взломать. С учетом сказанного вы можете использовать решение, предложенное @Shahab в его ответе , в качестве обходного пути, но это не действительно укажите свое намерение любому, кто поддерживает ваш код. Поэтому я думаю, что лучшее, что вы можете сделать, - это создать собственный Attribute
, который наследуется от CategoryAttribute
для управления процессом за вас:
public class CustomSortedCategoryAttribute : CategoryAttribute
{
private const char NonPrintableChar = '\t';
public CustomSortedCategoryAttribute( string category,
ushort categoryPos,
ushort totalCategories)
: base(category.PadLeft(category.Length + (totalCategories - categoryPos),
CustomSortedCategoryAttribute.NonPrintableChar))
{
}
}
Тогда вы можете использовать его как таковой
[CustomSortedCategory("Z Category",1,2)]
public string ZProperty {set;get;}
[CustomSortedCategory("A Category",2,2)]
public string AProperty {set;get;}
Просто убедитесь, что для свойства UseCompatibletextRendering
true
PropertyGrid
установлено значение true
, чтобы удалить непечатные символы для вас и для < Для code> PropertySort установлено значение Категоризованный
или Категоризованный алфавитный
, и вам следует идти дальше.
Небольшая вариация трюка '\ t', описанного выше, я просто попробовал его с символами возврата каретки ('\ r'). Кажется, он работает и позволяет избежать проблемы с всплывающей подсказкой, вызванной дополнительным пространством, введенным вкладкой.