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

时间:2009-06-03 16:26:07

标签: c# asp.net data-binding gridview

我正在尝试将ASP.NET GridView控件绑定到string数组,我得到以下项目:

  

具有名称的字段或属性   在所选内容中找不到“项目”   数据来源。

我应该在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 个答案:

答案 0 :(得分:20)

经过几个小时的搜索,我终于发现这种情况有一个特殊的DataField:“

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

我希望有一天能帮助别人:)

答案 1 :(得分:13)

尝试使用TemplateField替换BoundField,如下所示:

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

BTW我从another question

取消了这个

答案 2 :(得分: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>

答案 3 :(得分:4)

这是一个使用旧DataGrid的完整示例...所以看起来“!”技巧已广泛实施。这在VS2008中的ASP.NET下工作。当然,只需替换正确的元素名称即可使用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类中重新声明控件类型,因此如果只编辑元素名称,则必须手动更改。

答案 4 :(得分:1)

迈克尔,

代码行

<asp:BoundField DataField="Item" />

需要一个名为“Item”的列,如果您绑定到其中一个DataSource控件(如SqlDataSource,ObjectDataSource或LinqDataSource),则可以使用该列。由于您绑定了IEnumerable,因此没有这样的名称。