Binding an ASP.NET GridView Control to a string array

我只是一个虾纸丫 提交于 2019-12-18 12:26:18

问题


I am trying to bind an ASP.NET GridView control to an string array and I get the following item:

A field or property with the name 'Item' was not found on the selected data source.

What is correct value I should use for DataField property of the asp:BoundField column in my GridView control. Here is my source code:

ASPX page

<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>

Code Behind:

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

UPDATE

I need to have the AutoGenerateColumns attribute set to false because I need to generate additional asp:CommandField columns. I have updated my code sample to reflect this scenario


回答1:


One method is to pass it a class with a single, named field. That way, you can give it a name.

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

Then convert your string array to a list of the class

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();

Now you can name your DataField property

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



回答2:


After hours of search, I finally found that there is a special DataField for this case: "!"

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

I hope it'll help someone one day :)




回答3:


Try replacing the BoundField with a TemplateField like so:

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

BTW I lifted this from another question




回答4:


Here is a complete example using the old DataGrid...so it appears that the "!" trick has widespread implementation. This worked under ASP.NET in VS2008. Of course, just substitute the right element names to use a 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>

So as a GridView the inner section would be

    <asp:GridView runat="server" ID="Grid1" AutoGenerateColumns="false">
        <Columns>
            <asp:BoundField DataField="!" DataFormatString="Data: {0}"  HeaderText="Dyad"/>
        </Columns>
    </asp:GridView>

If you switch back and forth, notice that VS2008 (at least) cannot re-declare the control type in the Designer.cs class, so you'll have to change that by hand if just editing the element names.




回答5:


Michael,

The line of code

<asp:BoundField DataField="Item" />

expects a column with the name of "Item," which you would have if you were binding to one of the DataSource controls such as SqlDataSource, ObjectDataSource, or LinqDataSource. Since you are binding to an IEnumerable, you have no such name.



来源:https://stackoverflow.com/questions/945701/binding-an-asp-net-gridview-control-to-a-string-array

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!