Скрыть / отключить столбец ListView (не ширина = 0 Hack) - PullRequest
0 голосов
/ 27 сентября 2019

Мы обновляем дизайн наших списков, чтобы пользователь мог выбрать столбцы, которые он хотел бы отобразить.

Чтобы не мешать преобразованию Key-To-Column-Index при заполнении списка, мы хотели бы поддерживать «базовый» порядок столбцов, затем использовать display-index и (?) Visible-атрибут на определенные столбцы, чтобы настроить вид.

т.е. базовая таблица выглядит как

id | name | date

, она заполнена данными типа

ListViewItem lvi = new ListViewItem();
lvi.Text = someObject.ID;
lvi.SubItems.Add(someObject.Name);
lvi.SubItems.Add(someObject.Date);
...
ListView1.Items.AddRange(CollectionOfListViewItems);

Если пользователь теперь выбрал порядок отображения id | date | name, это может бытьлегко достигается (без изменения кода, который генерирует ListViewItems), просто изменяя значение displayindex определенного столбца.

Тем не менее, если пользователь хочет исключить столбец, существует обычная практика устанавливать ширину равной 0. Но это приводит к тому, что люди, которые пытаются расширить любой столбец, иногда просто расширяют столбец.с шириной 0 и запутались, что происходит.

Есть ли способ правильно скрыть столбец от отображаемой информации, фактически не удаляя столбец из списка?(При удалении столбца могут потребоваться корректировки в генерирующем коде, иначе заголовки / значения больше не будут правильно выровнены).

1 Ответ

0 голосов
/ 27 сентября 2019

Я теперь расширил width=0 взломать с помощью - давайте назовем это - displayIndex=0 взломать.Работает как шарм:

Итерация 1 : мы продолжаем добавлять столбцы в соответствии с нашим определением, поэтому нам не нужно реорганизовывать какой-либо код, который полагается на этот порядок столбцов:

foreach (ColumnDefinition cd in this.ColumnDefinitions)
{
    ColumnHeader ch = new ColumnHeader();
    ch.Name = cd.Name;
    ch.Tag = cd;
    ch.Text = cd.Text;

    this.extendedListView.Columns.Add(ch);
}

Итерация 2 : Чтобы уважать порядок отображения пользователей, мы модифицируем displayIndex, как упомянуто выше, как только все столбцы добавляются в представление списка:

foreach (ColumnHeader ch in this.extendedListView.Columns)
{
    //DisplayIndex known?
    if (keyToIndex.ContainsKey(ch.Name))
    {
        int idx = keyToIndex[ch.Name];
        ch.DisplayIndex = idx;
    }
}

Примечание. Столбцы, которые пользователь отменил, не имеют отображаемого индекса в конфигурации.Таким образом, они теперь где-то плавают (с шириной 0), что приводит к проблеме их расширения при попытке расширить другой столбец.

Итерация 3 : чтобы преодолеть эту проблему,мы просто повторили в другой раз и поместили каждый невидимый столбец в индекс 0. Ни один пользователь не должен пытаться изменить размер столбца, щелкнув по левой стороне самого левого столбца, видимого :

//Avoid inivisble columns (width 0) beeing stuck somewhere in between. 
//push them all to the front, cause no one will try to expand the "0st Column".
foreach (ColumnHeader ch in this.extendedListView.Columns)
{
    //DisplayIndex not known?
    if (!keyToIndex.ContainsKey(ch.Name))
    {
        ch.DisplayIndex = 0;
        ch.Width = 0;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...