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