Как я могу настроить сортировку категории по недвижимости GRID? -- .net поле с участием winforms поле с участием propertygrid пол Связанный проблема

How can I customize category sorting on a PropertyGrid?


22
vote

проблема

русский

Как я могу настроить сортировку категорий в <код> 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 ?

Английский оригинал

How can I customize the sorting of categories in a PropertyGrid?

If I set either of the following...

propertyGrid.PropertySort = PropertySort.Categorized; propertyGrid.PropertySort = PropertySort.CategorizedAlphabetical; 

... then the categories will be alphabetized. ("Alphabetical" would seem to apply to the properties within each category.) If I use PropertySort.NoSort, I lose categorization.

I'm populating my PropertyGrid with SelectObject, which is pretty easy:

this.propertyGrid1.SelectedObject = options; 

options is an instance of a class with suitably decorated properties:

    [CategoryAttribute("Category Title"),     DisplayName("Property Name"),     Browsable(true),     ReadOnly(false),     BindableAttribute(true),     DesignOnly(false),     DescriptionAttribute("...")]     public bool PropertyName {         get {             // ...         }          set {             // ...             this.OnPropertyChanged("PropertyName");         }     } 

I have a few dozen properties in half a dozen categories.

Is there some way I can adjust the category sort order while preserving my ease of use with SelectedObject?

</div
        
 
 

Список ответов

4
 
vote
vote
Лучший ответ
 

Если вы имеете в виду, что вы хотите, чтобы категории отсортированы в определенном (не алфавитном) пути, то нет - я не думаю, что вы можете сделать это. Возможно, вы захотите попробовать VisualHint - я ожидаю, что у него есть (так как вы можете схватить гораздо больше контроля).

 

If you mean that you want the categories sorted in a specific (non-alphabetical) way, then no - I don't think you can do that. You might want to try VisualHint - I expect it does have this (since you can seize a lot more control).

</div
 
 
21
 
vote

Я думаю, что эта ссылка полезна http://bytes.com/groups/ Net-C / 214456-Q-C / 214456-q-quoting-sorting-Chatione-Text-PropertyGrid

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

 

I think this link is useful http://bytes.com/groups/net-c/214456-q-ordering-sorting-category-text-propertygrid

I don't believe there is a way to do this. The only thing that I could find that indicates you might be able to do this is the PropertySort property. If you set it to none, it says that the properties are displayed in the order that they are received from the type descriptor. You might be able to create a proxy type descriptor between your object and the propertygrid, which would then return not only the properties in the correct order, but the properties with the categories in the order that you want them in...

</div
 
 
         
         
17
 
vote

Как сказал @marc Gravel, сказал в его ответ , в рамках нет ничего, что позволяет этому поведению. Любое решение будет взлом. С этим сказанным, вы можете использовать решение, предлагаемое @Shahab в его ответ в качестве работы, но это не Действительно указывает ваше намерение кому-либо поддержание вашего кода. Так что я думаю, что лучшее, что вы можете сделать, это создать пользовательский <код> Attribute , который наследует от <код> CategoryAttribute для обработки процесса для вас:

 <код> public class CustomSortedCategoryAttribute : CategoryAttribute {     private const char NonPrintableChar = ' ';      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;}   

Просто убедитесь, что вы устанавливаете <код> PropertyGrid 's <код> UseCompatibletextRendering свойство в <код> true , чтобы распределить непечатанные символы для вас и < код> PropertySort установлен на <код> package0 или <код> package1 , и вы должны быть хорошими, чтобы пойти.

 

Like @Marc Gravel said in his answer, there's nothing in the framework that allows this behaviour. Any solution will be a hack. With that said, you can use the solution suggested by @Shahab in his answer as a work-around but that doesn't really indicate your intention to anyone maintaining your code. So I think the best you can do is create a custom Attribute which inherits from CategoryAttribute to handle the process for you:

public class CustomSortedCategoryAttribute : CategoryAttribute {     private const char NonPrintableChar = ' ';      public CustomSortedCategoryAttribute(   string category,                                             ushort categoryPos,                                             ushort totalCategories)         : base(category.PadLeft(category.Length + (totalCategories - categoryPos),                     CustomSortedCategoryAttribute.NonPrintableChar))     {     } } 

Then you can use it as such

[CustomSortedCategory("Z Category",1,2)] public string ZProperty {set;get;} [CustomSortedCategory("A Category",2,2)] public string AProperty {set;get;} 

Just make sure you set the PropertyGrid's UseCompatibletextRendering property to true to strip out the non-printable characters for you and the PropertySort set to Categorized or CategorizedAlphabetical and you should be good to go.

</div
 
 
3
 
vote

Небольшое изменение при хитрости « T», описанное выше, я просто попробовал его с помощью каретки возврата символов (« R»). Похоже, работает и позволяет избежать проблемы подсказки, вызванной дополнительным пространством, представленным вкладкой.

 

A small variation on the ' ' trick described above, I just tried it with carriage return characters (' ') instead. It seems to work and avoids the tooltip problem caused by the extra space introduced by a tab.

</div
 
 

Связанный проблема

-1  Ошибка - RaceOnrcwleanean был обнаружен во время параллельного метода Parallel.invoke  ( Error raceonrcwcleanup was detected during parallel invoke method ) 
Я пытаюсь экспортировать все листы файла Excel, используя следующую часть кода. Я звоню один метод, используя разные значения параметров. Это дает мне после...

2  Почему мой список дисплея ListView не отображается или детали элементов?  ( Why doesnt my listview display list or details items ) 
Использование C # .NET 2.0, у меня есть ведущий владелец ListView, где я переоцениваю на события OnDrawcolumnheader, OnDrawitem и Ondrawsubitem. Если я устано...

1  Должна ли модель сделать вызовы услуг для получения данных  ( Should model make service calls to get data ) 
Мы создаем веб-сайт, используя шаблон MVC. До сих пор все страницы, которые мы построили использованные модели, которые должны были работать на справочных дан...

3  Удалить элемент от JsonResult в C #  ( Remove an element from jsonresult in c sharp ) 
У меня есть <код> JsonResult объект для возврата из метода MVC, но мне нужно удалить один элемент от него перед отправкой. <Сильное> Обновление: Я пытаюс...

20  Как придумать имена более четких интерфейсов?  ( How to come up with clearer interface names ) 
Я видел в приложении, где он имел интерфейсы, такие как: <код> IHasContent IHasValue IHasMesh IHasGeometry IHasTransformation Если они не будут?: <код...

249  Для чего используется «Динамический» тип в C # 4.0 для?  ( What is the dynamic type in c sharp 4 0 used for ) 
C # 4.0 представил новый тип под названием «Dynamic». Все это звучит хорошо, но что бы программист использовать это для? Есть ситуация, когда она может спас...

2  Замените оператор импорта и загрузите DLL в код для использования объекта?  ( Replace imports statement and load dll in code to use object ) 
У меня в настоящее время есть приложения, которые используют бесплатную библиотеку регистрации NLOG (DLL), которую я ссылаюсь в моем проекте VB.NET (Импорт оп...

3  ASP.NET/ADO.NET: обработка многих соединений базы данных внутри объекта .NET?  ( Asp net ado net handling many database connections inside a net object ) 
У нас есть объект .NET, который делает много чтения / записи с базой данных. В течение всего жизненного цикла этого объекта (или страницы ASP, которая ее испо...

0  Можно ли программно получить общую ссылку Dropbox, не отправляя пользователя на страницу входа в Dropbox?  ( Is it possible to programmatically get a shared dropbox link without sending the ) 
Я разрабатываю веб-приложение в VB.NET 4.5 и с помощью третьей стороны: <Код> Dropnet . Я задаюсь вопросом, возможно ли получить общую ссылку из Dropbox- прог...

157  Попытался прочитать или писать защищенную память. Это часто является признаком того, что другая память повреждена  ( Attempted to read or write protected memory this is often an indication that ot ) 
Я надеюсь, что кто-то может просветить меня относительно того, что может вызвать эту ошибку: попытался прочитать или писать защищенную память. Это часто яв...

1  C # код для объемного обновления SQL Server  ( C sharp code to bulk update sql server ) 
У нас есть этот код C #, который будет обновлять таблицу базы данных SQL Server на основе флагов в структуре. <код> public struct stSRK { public string...

4  Какую книгу на TDD для C # с лечением издевателей  ( What book on tdd for c sharp with treatment of mocks ) 
Можете ли вы помнить книгу о тестировании подразделения и TDD для C #, по крайней мере, некоторое лечение отдельных объектов? Я видел эту Вопрос Но, похож...

770  Файл метаданных '.dll' не может быть найден  ( Metadata file dll could not be found ) 
Я работаю над проектом WPF, C # 3.0, и я получаю эту ошибку: <код> Error 1 Metadata file 'WORK=- ToolsVersionManagementSystemBusinessLogicLayerinDebug Busi...

9  D8045: не может компилировать файл c 'serialCommands.c с опцией / clr / clr  ( D8045 cannot compile c file serialcommands c with the clr option ) 
Я получаю сообщение компилятора D8045. Невозможно компилировать файл C 'serialCommands.c ° С опцией / clr. Этот файл - это библиотека C, которая была написа...

-1  Модульный монолит с DDD и устаревшими данными  ( Modular monolith with ddd and legacy data ) 
В моем домене у меня есть следующие модули: WMS (управление складом) Спросальдер (содержит продавщику, и т. Д.) Это приложение Multi Managaness, что означае...

Связанный проблема

-1  Ошибка - RaceOnrcwleanean был обнаружен во время параллельного метода Parallel.invoke 
2  Почему мой список дисплея ListView не отображается или детали элементов? 
1  Должна ли модель сделать вызовы услуг для получения данных 
3  Удалить элемент от JsonResult в C # 
20  Как придумать имена более четких интерфейсов? 
249  Для чего используется «Динамический» тип в C # 4.0 для? 
2  Замените оператор импорта и загрузите DLL в код для использования объекта? 
3  ASP.NET/ADO.NET: обработка многих соединений базы данных внутри объекта .NET? 
0  Можно ли программно получить общую ссылку Dropbox, не отправляя пользователя на страницу входа в Dropbox? 
157  Попытался прочитать или писать защищенную память. Это часто является признаком того, что другая память повреждена 
1  C # код для объемного обновления SQL Server 
4  Какую книгу на TDD для C # с лечением издевателей 
770  Файл метаданных '.dll' не может быть найден 
9  D8045: не может компилировать файл c 'serialCommands.c с опцией / clr / clr 
-1  Модульный монолит с DDD и устаревшими данными