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

时间:2011-03-07 10:06:42

标签: c# wpf listview datagridview jscript.net

我在另一个程序集中得到了一个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]的映射?

2 个答案:

答案 0 :(得分:3)

这是因为正在调用列表中每个项的ToString()方法。如果没有被继承类型覆盖,Object.ToString()将返回对象的类型名称。

还有一个问题,您的列表不会引发更改事件,因此UI不知道数据已更改并需要刷新。

答案 1 :(得分:3)

如果列没有DisplayMemberBindingCellTemplate,则会在网格中的每个项目上调用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);

<强> [编辑] 您的问题的答案:

  

每次调用ToString()时   item(代表一行),怎么样   映射到列的列   网格视图?我该怎样改变一个项目   行,以便新列   填充?

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

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

<强> [编辑]

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

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

  
    

如何设置DataMemberBinding以实现到ListRow.Items [5]的映射?

  

答案:

newColumn.DisplayMemberBinding = new Binding("Items[5]");