Как я могу убедиться, что элемент ListView всегда изменяет размеры, чтобы показать все строки? - PullRequest
0 голосов
/ 15 июня 2010

У меня есть панель, которая содержит TableLayoutPanel, которая сама содержит число ListViews и Labels.

. Мне бы хотелось, чтобы размер каждого списка изменялся, чтобы соответствовать всем его размерам.содержимое по вертикали (то есть так, чтобы каждая строка была видна).TableLayoutPanel должен обрабатывать любую вертикальную прокрутку, но я не могу понять, как заставить ListView изменять свой размер в зависимости от количества строк.

Нужно ли обрабатывать OnResize и изменять размер вручнуюили уже есть что с этим справиться?

1 Ответ

0 голосов
/ 18 июня 2010

Аналогичный вопрос предложил использовать ObjectList , но это выглядело как излишество для того, что я хотел.Поэтому вместо этого я сделал эту простую перегрузку (ниже), чтобы изменить ее размер на основе элементов в списке.

Я только протестировал это отображение в режиме подробностей в Windows Vista, но это просто и, кажется, работает хорошо.

#pragma once

/// <summary> 
/// A ListView based control which adds a method to resize itself to show all
/// items inside it.
/// </summary>
public ref class ResizingListView :
public System::Windows::Forms::ListView
{
public:
    /// <summary>
    /// Constructs a ResizingListView
    /// </summary>
    ResizingListView(void);

    /// <summary>
    /// Works out the height of the header and all the items within the control
    /// and resizes itself so that all items are shown.
    /// </summary>
    void ResizeToItems(void)
    {
        // Work out the height of the header
        int headerHeight = 0;
        int itemsHeight = 0;
        if( this->Items->Count == 0 )
        {
            // If no items exist, add one so we can use it to work out
            this->Items->Add("");
            headerHeight = GetHeaderSize();
            this->Items->Clear();

            itemsHeight = 0;
        }
        else
        {
            headerHeight = GetHeaderSize();
            itemsHeight = this->Items->Count*this->Items[0]->Bounds.Height;
        }

        // Work out the overall height and resize to it
        System::Drawing::Size sz = this->Size;
        int borderSize = 0;
        if( this->BorderStyle != System::Windows::Forms::BorderStyle::None )
        {
            borderSize = 2;
        }
        sz.Height = headerHeight+itemsHeight+borderSize;
        this->Size = sz;
    }

protected:
    /// <summary>
    /// Grabs the top of the first item in the list to work out how tall the
    /// header is. Note: There _must_ at least one item in the list or an 
    /// exception will be thrown
    /// </summary>
    /// <returns>The height of the header</returns>
    int GetHeaderSize(void)
    {
        return Items[0]->Bounds.Top;
    }


};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...