Генерация столбцов в ObjectListView C#

#c# #objectlistview

#c# #objectlistview

Вопрос:

В обычном ListView я обычно генерирую столбцы на лету с помощью чего-то вроде:

         var list = new List<ColumnNameSize>();
        list.Add(new ColumnNameSize("Computer Name", 0));
        list.Add(new ColumnNameSize("Full Computer Name", 150));
        list.Add(new ColumnNameSize("Migrated", 150));
        list.Add(new ColumnNameSize("Disabled", 0));
        list.Add(new ColumnNameSize("Disabled amp; Not Migrated", 150));
        generateListView(listViewObjects, list);

        public static void generateListView(ListView varListView, List<ColumnNameSize> nameSizeList) {
        varListView.ClearColumns();
        foreach(ColumnNameSize nameSize in nameSizeList) {
            varListView.AddColumn(nameSize.ColumnName, nameSize.ColumnSize);
        }
    }
  

Как бы я это сделал в ObjectListView. Я пробовал несколько комбинаций:

     public void generateListView(ObjectListView varListView, List<ColumnNameSize> nameSizeList) {

        ArrayList myArrayList = new ArrayList();
        foreach (ColumnNameSize nameSize in nameSizeList) {
            OLVColumn columnHeader = new BrightIdeasSoftware.OLVColumn();  
            columnHeader.Width = nameSize.ColumnSize;
            columnHeader.Text = nameSize.ColumnName;
            myArrayList.Add(columnHeader);
            varListView.AllColumns.Add(columnHeader);
        }
        Object columnsHeader = myArrayList.ToArray();
        varListView.Columns.AddRange( columnsHeader);
    }
  

Но, похоже, ни один из них не работает…

Комментарии:

1. Похоже, вы добавляете столбцы дважды; один раз из AllColumns.Add() , а затем снова с помощью Columns.AddRange()

2. Я знаю, это то, что я пробовал… Я сделал это с помощью . Добавить, и он не появился .. поэтому я попробовал с AddRange, но он ожидает OLVColumn[], а не object .

3. Вместо Columns.AddRange() вызова RebuildColumns() для их восстановления из AllColumns

Ответ №1:

Можете ли вы попробовать это?

  public void generateListView(ObjectListView varListView, List<ColumnNameSize> nameSizeList) {

        List<OLVColumn>  columnsList = new List<OLVColumn>();
        foreach (ColumnNameSize nameSize in nameSizeList) {
            OLVColumn columnHeader = new BrightIdeasSoftware.OLVColumn();  
            columnHeader.Width = nameSize.ColumnSize;
            columnHeader.Text = nameSize.ColumnName;
            columnsList .Add(columnHeader);
            varListView.AllColumns.Add(columnHeader);
        }
        varListView.Columns.AddRange( columnsList.Cast<System.Windows.Forms.ColumnHeader>().ToArray());
    }
  

Комментарии:

1. Это работает .. но только если я добавлю один столбец вручную в IDE, а затем выполню это. Затем он добавляет больше столбцов. Если я удалю столбец из IDE и просто использую это, он не отображается. Кажется, должна быть какая-то настройка, которая позволяет отображать заголовки.. Возможно, это сработало с первых попыток…

2. Я немного изменил его, исходя из использования на этой странице assembla.com/code/deskblog/git/nodes/ObjectListView/Tests / … посмотрим, поможет ли это, иначе у меня нет другой идеи. Я удалю свой ответ.

3. Это работает превосходно. Просто нужно выяснить, как теперь «показывать» заголовки 🙂 Вся идея, стоящая за этим, которую вы сделали, работает просто отлично. Поэтому не удаляйте. Просто мне, вероятно, не хватает какой-то настройки для его отображения.

4. Он начал работать после того, как я добавил в него некоторые данные. Итак, tnx много.

5. ObjectListView выглядит очень интересно, но не похоже, что он хорошо документирован.

Ответ №2:

Чтобы сделать столбцы видимыми после добавления их вручную с помощью кода, вам нужно перестроить их с помощью следующей строки:

 varListView.RebuildColumns();
  

Основываясь на ответе Bala, вы получаете следующий код:

 public void generateListView(ObjectListView varListView, List<ColumnNameSize> nameSizeList)
{
    List<OLVColumn> columnsList = new List<OLVColumn>();
    foreach (ColumnNameSize nameSize in nameSizeList)
    {
        OLVColumn columnHeader = new BrightIdeasSoftware.OLVColumn();
        columnHeader.Width = nameSize.ColumnSize;
        columnHeader.Text = nameSize.ColumnName;
        columnsList.Add(columnHeader);
        varListView.AllColumns.Add(columnHeader);
    }

    varListView.Columns.AddRange(columnsList.Cast<System.Windows.Forms.ColumnHeader>().ToArray());
    varListView.RebuildColumns();
}
  

Ответ №3:

Чтобы ObjectListView работал должным образом, вы должны определить имя требуемого свойства вашего объекта модели как AspectName.

Вместо того, чтобы сначала создавать список ColumnNameSize, я бы предпочел добавлять столбцы один за другим:

 ObjectListView1.AllColumns.Add(new OLVColumn()
{
    Text = "Column Header",
    Width = 100,
    AspectName = "myProperty"
});

ObjectListView1.RebuildColumns();