c# – ListView以编程方式添加列显示项目类型

我在另一个程序集中得到了一个ListView,并希望为其添加一个列.列表视图中的项是该程序集中类的对象.

当我添加这样的列

var col : GridViewColumn = new GridViewColumn();
col.Header = "Header text";
list.View.Columns.Add(col);

列出现但列表视图中的所有行都具有该新列中项目类型的名称.即使我更改新列的值(itemclass.Items [newColIdx] =“zz”),也不会显示.没有涉及数据绑定或细胞模板.

这是为什么?

编辑:也许我可以增强问题:如果ListView.Items包含A类数组 – 如何在GridView中控制A的哪些内容?我需要逆向工程,DisplayMemberBinding为null,因此它不使用数据绑定AFAIK.

赏金问题:当每个项目(代表一行)调用ToString()时,它是如何映射到GridView的列的?如何更改行中的项目以便填充新列?

尝试找到此解决方案时的特殊问题是,它在较大的C#.NET应用程序中的JScript沙箱中运行,除了使用消息框和反射之外,不提供任何调试可能性.

编辑:问题是我正在编写一个在第三方.NET应用程序中运行的JScript,并让我有机会用.NET做很多事情.这是一个向listview添加功能的脚本.我可以访问listview,它由第三方应用程序填充数据库数据.我不知道它是怎么做到的.我可以以编程方式添加带有自定义内容的自定义行(而不是与DB相关).但是当我添加一个自定义列时,我似乎无法在den行中查看它的值.

添加的行的类型为3rdParty.ListRow,并包含一个属性Items,我为其分配一个字符串数组.数组的值显示在代表列中 – 但不会显示在添加的列中.在那里我只得到文本3rdParty.ListRow,这是因为在ListRow上调用了ToString().

那么:我怎样才能告诉新列(例如索引5)显示ListRow.Items [5]而不是ListRow.ToString()?我喜欢以与现有列相同的方式执行此操作,似乎Alex提到的所有属性都未定义.我如何设置DataMemberBinding以实现到ListRow.Items [5]的映射?

解决方法:

如果列没有DisplayMemberBinding或CellTemplate,则在网格中的每个项目上调用ToString,并将计算值用作单元格内容.

例如,如果你有课程:

public class Person
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public override string ToString()
    {
        return LastName;
    }
}

如果将Person的集合绑定到网格视图:

var people =
    new List<Person>
    {
        new Person { FirstName = "Peter", LastName = "Smith" }, 
        new Person { FirstName = "Steve", LastName = "White" },
        new Person { FirstName = "Dave", LastName = "Gates" },
    };

listView1.ItemsSource = people;

如果您创建一个没有绑定的新列,那么LastName将显示在此列中,因为重写的ToString()将返回LastName.如果更改ToString以返回FirstName,则新列将显示FirstName.

希望我能正确理解你的问题.

[编辑]

如果添加许多新列并且不使用DisplayMemberBinding,则所有新列都将评估并显示ToString()结果.
您需要设置DisplayMemberBinding以显示特定属性.

var newColumn = new GridViewColumn();
newColumn.Header = "Test";
newColumn.DisplayMemberBinding = new Binding("FirstName");
gridView.Columns.Add(newColumn);

[编辑]
您的问题的答案:

When ToString() is called on every
item (which represents a row), how is
that mapped towards the columns of the
GridView? How must I alter an item in
the row so that the new column is
filled?

呈现单元格展示器时会调用ToString,除非您指定了绑定或模板,最后也会使用绑定.除非重写ToString或绑定到列的属性,否则不能更改行项以控制它在网格中的表示方式.

不确定我完全理解你的问题.你正在添加一个新列,对吗?为什么不在列上设置DisplayMemberBinding属性?如果您这样做,您将能够在列中显示您想要的任何内容.

[编辑]

我想我回答了你的赏金问题:).我想我已经获得了赏金:).

但是,这是您下一个问题的答案:

How would I set DataMemberBinding to achieve mapping to ListRow.Items[5]?

答案:

newColumn.DisplayMemberBinding = new Binding("Items[5]");
上一篇:c# – 如何将复杂对象绑定到DataGridView?


下一篇:ARM微控制器-MCU基础及CPU运行过程