Как использовать GroupFormatter с элементом управления ObjectListView

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

У кого-нибудь есть примеры, которые могли бы это продемонстрировать? Я хочу удалить текст из заголовка группы и добавить нижний колонтитул (другой текст для нижнего колонтитула). А также изменение шрифта и т. Д.

Любые примеры будут очень полезны.

1 ответ

Решение

Вы можете проанализировать код для

public void MakeGroupies<T>(T[] values, string[] descriptions, object[] images, string[] subtitles, string[] tasks)

метод класса ObjectListView. Это явно устанавливает делегаты свойств GroupKeyGetter, GroupKeyToTitleConverter и GroupFormatter.

Это C#, но ваша адаптация VB должна быть простой. Я использую этот небольшой тестовый класс в качестве типа объекта для привязки к представлению списка.

public class TestClass
{
    private readonly string _s;
    private readonly float _f;

    public TestClass( string p1, float p2 )
    {
        this._s = p1;
        this._f = p2;
    }

    [OLVColumn(DisplayIndex = 1, Name="S", Title="String")]
    public string S {get {return this._s;}}
    [OLVColumn( DisplayIndex = 2, Name = "F", Title = "Float" )]
    public float F {get {return this._f;}}
}

Чтобы не определять свойства столбцов вручную, я использую атрибуты внутри связанного объекта и

BrightIdeasSoftware.Generator.GenerateColumns( this.olv, typeof( TestClass ) );

позвоните в форму / пользовательский элемент управления, где я использую представление списка. Фактически, вот метод, который полностью изолирует конфигурацию ObjectListView:

        void SetData( TestClass[] objects )
        {
            // build list columns
            Generator.GenerateColumns( this.olv, typeof( TestClass ) );
            // use groups and make current column the priimary sort column
            this.olv.ShowGroups = true;
            this.olv.SortGroupItemsByPrimaryColumn = false;
            // loop through columns and set properties            
            foreach( OLVColumn col in this.olv.Columns )
            {
                col.Groupable = true;
                col.Sortable = true;
                if( col.Name == "F" )
                { 
                    col.MakeGroupies<float>( new float[] { 10f, 100f, 1000f }, new string[] { "<10", "10-100", "100-1000", ">1000" } );
                }
                else if( col.Name == "S" )
                {
                    col.UseInitialLetterForGroup = false;
                    //
                    col.GroupKeyGetter = ( obj ) =>
                    {
                        TestClass tc = (TestClass)obj;
                        switch( char.ToLower( tc.S[0] ) )
                        {
                            case 'a':
                            case 'e':
                            case 'i':
                            case 'o':
                            case 'u': return true;
                            default: return false;
                        }
                    };
                    //
                    col.GroupKeyToTitleConverter = ( o ) => { bool b = (bool)o; return b ? "vowel" : "consonant"; };
                    //
                    col.GroupFormatter = ( /*OLVGroup*/ group, /*GroupingParameters*/ parms ) => 
                    { 
                        string s = string.Format ("{0} {1}", group.GroupId, group.Id);
                        //group.BottomDescription = "BottomDescription: " + s;
                        //group.TopDescription = "TopDescription: " + s;
                        group.Footer = "Footer: " + s;                        
                    };

                }

            }
            //
            this.olv.RebuildColumns();
            //
            this.olv.SetObjects( objects );
        }

У вас определенно будет один отдельный нижний колонтитул для каждой группы.

Другие вопросы по тегам