将ASP.NET GridView控件绑定到字符串数组

10

我正在尝试将 ASP.NET 的 GridView 控件绑定到一个 string 数组上,但是我得到了以下提示信息:

在所选数据源中找不到名称为“Item”的字段或属性。

在我的 GridView 控件中,asp:BoundField 列的 DataField 属性应该使用哪个正确的值?下面是我的源代码:

ASPX 页面

<asp:GridView ID="MyGridView" runat="server" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField DataField="Item" />
        <asp:CommandField ButtonType="Link" ShowSelectButton="true" SelectText="Click Me!" />
    </Columns>
</asp:GridView>

后台代码:

string[] MyArray = new string[1];
MyArray[0] = "My Value";
MyGridView.DataSource = MyArray;
MyGridView.DataBind();

更新

我需要将AutoGenerateColumns属性设置为false,因为我需要生成额外的 asp:CommandField 列。我已经更新了我的代码示例以反映这种情况。

5个回答

21

经过数小时的搜索,我终于发现了一个特殊的DataField,可以解决这个问题:" !"

<asp:GridView ID="MyGridView" runat="server" AutoGenerateColumns="false">
<Columns>
    <asp:BoundField DataField="!" />
</Columns>
</asp:GridView>

希望有一天它能对某人有所帮助 :)


嗯,我刚在一个选择框(下拉框)中尝试了一下,但它没有起作用:( 我想这可能是特定于GridView的。这似乎是数据绑定的一个非常明显的通用要求,我真的很惊讶没有一个正确的答案。 - Andy
哇,你有找到这个信息的链接吗? - Colin Pear
1
仍然在2016-2017年有用! - good-to-know

13

尝试使用类似于TemplateField的方式替换BoundField:

<asp:TemplateField HeaderText="String Value">
        <ItemTemplate>
            <%# Container.DataItem %>
        </ItemTemplate>
    </asp:TemplateField>

顺便说一句,我从另一个问题中获取了这个信息


不知道为什么,我总是记不住 Container.DataItem 的语法 :) - R.L.

9

一种方法是将一个具有单个命名字段的类传递给它。这样,您可以给它一个名称。

public class GridRecord
{
    public string MyValue { get; set; }
}

然后将您的字符串数组转换为该类的列表。
string[] MyArray = new string[1];
MyArray[0] = "My Value";
List<GridRecord> MyList = (
    from ar in myArray
    select new GridRecord
    {
        MyValue = ar
    }).ToList();
MyGridView.DataSource = MyList;
MyGridView.DataBind();

现在您可以为DataField属性命名。
<asp:GridView ID="MyGridView" runat="server" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField DataField="MyValue" />
    </Columns>
</asp:GridView>

谢谢,我喜欢使用LINQ的解决方案。 - Michael Kniskern
我该如何在这里使用类似上面的东西:http://stackoverflow.com/questions/34209825/how-to-combine-multiple-lists-and-use-as-a-gridview-datasource 谢谢。 - Si8

4

这里有一个使用旧DataGrid的完整示例...所以看起来"!"技巧已经被广泛应用。这在ASP.NET中的VS2008下有效。当然,只需替换正确的元素名称以使用GridView。

<%@ Page
    Language="C#" 
    AutoEventWireup="true" 
    CodeBehind="Default.aspx.cs" 
    Inherits="WebApplication2._Default"
%>
<%@Import
    Namespace="System.Collections.Generic"
%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>

    <script type="text/C#" runat="server">
        void initList()
        {           
        List<String> myList = new List<String>();
        myList.Add("Hello");
        myList.Add("Chatting");
        myList.Add("Goodbye");
        Grid1.DataSource = myList;
        Grid1.DataBind();
        }
    </script>    
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <%initList(); %>
        <asp:DataGrid runat="server" ID="Grid1" AutoGenerateColumns="false">
            <Columns>
                <asp:BoundColumn DataField="!" DataFormatString="Data: {0}"  HeaderText="Dyad"/>
            </Columns>
        </asp:DataGrid>
    </form>
</body>
</html>

作为一个GridView,内部部分将会是:
    <asp:GridView runat="server" ID="Grid1" AutoGenerateColumns="false">
        <Columns>
            <asp:BoundField DataField="!" DataFormatString="Data: {0}"  HeaderText="Dyad"/>
        </Columns>
    </asp:GridView>

如果你不断地来回切换,请注意VS2008(至少)不能在Designer.cs类中重新声明控件类型,所以如果只是编辑元素名称,你需要手动更改它。


1

迈克尔,

这行代码

<asp:BoundField DataField="Item" />

期望有一个名为“Item”的列,如果您绑定到其中一个DataSource控件(例如SqlDataSource、ObjectDataSource或LinqDataSource),则会自动创建。但是,由于您正在绑定到IEnumerable,因此没有这样的名称。


谢谢,好的建议!我已经更新了代码,使用了正确的名称。 - Michael La Voie

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