【问题标题】:Binding an ASP.NET GridView Control to a string array将 ASP.NET GridView 控件绑定到字符串数组
【发布时间】:2010-10-31 01:11:23
【问题描述】:

我正在尝试将 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 列。我已经更新了我的代码示例以反映这种情况

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • hmm,刚刚在选择框(下拉菜单)中尝试了它,但它不起作用:(我想知道这是否特定于 GridView。这似乎是数据绑定的一个明显的一般要求,我真的很惊讶没有正确的答案
    • 哇。您是否有指向您在何处找到此信息的链接?
    • 在 2016-2017 年仍有帮助!
    【解决方案2】:

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

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

    顺便说一句,我从 another question 提出了这个

    【讨论】:

    • 谢谢。出于某种原因,我永远记不起 Container.DataItem 语法:(
    【解决方案3】:

    一种方法是向它传递一个具有单个命名字段的类。这样,您就可以为其命名。

    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>
    

    【讨论】:

    【解决方案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 类中重新声明控件类型,因此如果仅编辑元素名称,则必须手动更改。

    【讨论】:

      【解决方案5】:

      迈克尔,

      代码行

      <asp:BoundField DataField="Item" />
      

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

      【讨论】:

      • 谢谢,好点子!我现在已经更新了代码以使用正确的名称。
      猜你喜欢
      • 2015-09-27
      • 2010-10-30
      • 1970-01-01
      • 2012-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      相关资源
      最近更新 更多