Подтвердить что ты не робот

Как настроить сортировку категорий в PropertyGrid?

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

4b9b3361

Ответ 1

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

Ответ 2

Я думаю, что эта ссылка полезна http://bytes.com/groups/net-c/214456-q-ordering-sorting-category-text-propertygrid

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

Ответ 3

Как @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;}

Просто убедитесь, что для свойства PropertyGrid UseCompatibletextRendering установлено значение true, чтобы вырезать непечатаемые символы для вас, а PropertySort - Categorized или CategorizedAlphabetical, и вы должны быть хороши для перейти.

Ответ 4

Небольшая вариация трюка '\ t', описанная выше, я просто попробовал ее с символами возврата каретки ('\ r'). Кажется, что он работает и позволяет избежать проблемы с подсказкой, вызванной дополнительным пространством, введенным вкладкой.