#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();