如何将List<Int>绑定到GridView?

9
这可能是一个比较奇怪的问题,因为通常人们只将复杂类型绑定到GridView。但我需要绑定一个Int列表(字符串也是如此)。 通常,用于绑定的属性是对象属性的名称,但当使用Int或String时,该值正好是对象本身,而不是属性。
那么获取对象值的“名称”是什么?我尝试过“Value”、“”(空)、“this”、“item”,但都没有成功。
我指的是Web表单中的GridView。
更新
有一个相关的Stack Overflow问题,链接如下:How to bind a List to a GridView
5个回答

10
<BoundField DataField="!" /> 可以解决问题(因为 BoundField.ThisExpression 等于“!”)。

7
<asp:TemplateField>
   <ItemTemplate>
       <%# Container.DataItem.ToString() %>
   </ItemTemplate>
</asp:TemplateField>

使用GridView时,当使用绑定列时,只需指定名称即可。这对于重复器或自定义列非常有用。 - CodeClimber
你能使用TemplateField吗? - terjetyl
实际上,容器不起作用,你必须使用<%# GetDataItem.ToString() %>,这是一个未文档化的方法,用于获取DataItem。 - CodeClimber
除了@Andrey Shchekin提供的最简单解决方案之外,当结果显示值比只有值更复杂时,例如包含值的链接或文本时,此方法非常有用。 - Marcel

3

我想你可能需要将数据放入一个包装类中 - 例如:

public class Wrapper<T> {
    public T Value {get;set;}
    public Wrapper() {}
    public Wrapper(T value) {Value = value;}
}

那么,您可以将其绑定到一个List<Wrapper<T>>(作为Value) - 例如使用类似以下的内容(C#3.0):

var wrapped = ints.ConvertAll(
            i => new Wrapper<int>(i));

或者C# 2.0:

List<Wrapper<int>> wrapped = ints.ConvertAll<Wrapper<int>>(
    delegate(int i) { return new Wrapper<int>(i); } );

那是我的第一种方式,但我记得曾经使用过特定的名称来获取值。我想我需要挖掘反射器 :) - CodeClimber
1
在我看来,这是一个相当复杂的解决方案。看看我的答案,它是同样想法的更简单版本。 - M4N

2
这基本上是Marc的想法,但更简单。
它创建了一个匿名包装类,您可以将其用作网格的数据源,然后将列绑定到“Value”成员:
List<int> list = new List<int> { 1,2,3,4};
var wrapped = (from i in list select new { Value = i }).ToArray();
grid.DataSource = wrapped;

至少对于单向绑定,这很好。 - Marc Gravell

-1

如果您需要编写要呈现的属性名称,则必须将整数(或字符串)值封装在一个具有返回该值的属性的类中。在网格中,您只需编写<%# Eval("PropertyName") %>


但是Int没有PropertyName :) - CodeClimber
是的,但你得创建一个类像这样: <code> class MyInt { public int myValue; public int MyValue { get{ return myValue; } } } </code> - jaloplo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接