【问题标题】:Generating columns in ObjectListView C#在 ObjectListView C# 中生成列
【发布时间】:2011-04-27 20:57:24
【问题描述】:

在普通的 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 & 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);
    }

但似乎没有一个工作......

【问题讨论】:

  • 好像你添加了两次列;一次来自AllColumns.Add(),然后再次来自Columns.AddRange()
  • 我知道,这就是我尝试过的......我用 .Add 做到了,但它没有显示出来......所以我尝试使用 AddRange 但它需要 OLVColumn[] 而不是对象。
  • 而不是 Columns.AddRange() 调用 RebuildColumns()AllColumns 重建它们

标签: c# objectlistview


【解决方案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());
    }

【讨论】:

  • 它可以工作.. 但前提是我在 IDE 中手动添加一列然后执行此操作。然后它添加更多列。如果我从 IDE 中删除该列并仅使用它,它就不会出现。似乎必须有一些设置可以显示标题..它可能与第一次尝试一起工作......
  • 我根据本页assembla.com/code/deskblog/git/nodes/ObjectListView/Tests/…中的用法稍微修改了它,看看是否有帮助,否则我没有其他想法。我会删除我的答案。
  • 它适用于 tnx。现在只需要找出如何“显示”标题 :-) 你所做的整个想法都很好。所以不要删除。只是我可能缺少一些设置来显示它。
  • 在我添加一些数据后它开始工作。所以很多。
  • 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-10
      • 2011-09-22
      • 1970-01-01
      • 2015-01-01
      • 1970-01-01
      • 2015-12-09
      相关资源
      最近更新 更多