【问题标题】:How to populate asp:GridView from code?如何从代码中填充 asp:GridView?
【发布时间】:2012-10-09 03:15:39
【问题描述】:

我的代码中有一个List<string[]> items 列表,其中填充了字符串数组。在 ASPX 页面上,我添加了一个新的网格视图控件:

<asp:GridView ID="ProductList" runat="server" AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="ProductID" EnableViewState="False">
  <Columns>
    <asp:BoundField DataField="ProductName" HeaderText="Product" SortExpression="ProductName" />
    <asp:BoundField DataField="CategoryName" HeaderText="Category" ReadOnly="True" SortExpression="CategoryName" />
    <asp:BoundField DataField="SupplierName" HeaderText="Supplier" ReadOnly="True" SortExpression="SupplierName" />
    <asp:BoundField DataField="UnitPrice" DataFormatString="{0:C}" HeaderText="Price" HtmlEncode="False" SortExpression="UnitPrice" />
    <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued" SortExpression="Discontinued" />
  </Columns>
</asp:GridView>

我知道我应该以类似于以下的方式为网格视图指定 DataSourceID 属性:

<asp:GridView ... `DataSourceID="ObjectDataSource1" ... > 
</asp:GridView>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" OldValuesParameterFormatString="original_{0}" SelectMethod="GetProducts" TypeName="ProductsBLL">
</asp:ObjectDataSource>

但是,我不知道OldValuesParameterFormatStringSelectMethodTypeName 属性代表什么。另外,我没有要绑定的数据库,我只有一个名为items 的字符串数组列表。你能帮我填充网格视图吗?根本不需要通过绑定来完成。谢谢!

【问题讨论】:

    标签: asp.net data-binding gridview binding populate


    【解决方案1】:

    您甚至不需要 ObjectDataSource。在代码隐藏的 Page_Load 中,您可以解析字符串数组列表并动态创建 DataTable。

    确保将其包裹在 Not Page.IsPostback 周围,这样它就不会在回发时重新绑定。

    List<string[]> stringList = null;
    
    DataTable dt = new DataTable();
    DataRow dr = null;
    dt.Columns.Add("ProductName", System.Type.GetType("System.String"));
    dt.Columns.Add("CategoryName", System.Type.GetType("System.String"));
    dt.Columns.Add("SupplierName", System.Type.GetType("System.String"));
    dt.Columns.Add("UnitPrice", System.Type.GetType("System.Double"));
    dt.Columns.Add("Discontinued", System.Type.GetType("System.String"));
    
    foreach (string[] s in stringList) {
        foreach (string str in s) {
            dr = dt.NewRow();
            dr["ProductName"] = s[0];
            dr["CategoryName"] = s[1];
            dr["SupplierName"] = s[2];
            dr["UnitPrice"] = s[3];
            dr["Discontinued"] = s[4];
            dt.Rows.Add(dr);
        }
    }
    
    dt.AcceptChanges();
    ProductList.DataSource = dt;
    ProductList.DataBind();
    

    【讨论】:

    • 您的回答包括我在自己的项目中实现这一点所需的一切.....万分感谢'
    【解决方案2】:

    编辑:您必须更改其中的一些代码以满足您的需要。我正在根据您提供的GridView 代码对存储在您的string[] 中的数据类型进行假设。

    您需要考虑创建一个class 用于您的项目,而不是string[]。可能是这样的:

    public class MyObject
    {
        public string ProductName { get; set; }
        public string CategoryName { get; set; }
        public string SupplierName { get; set; }
        public decimal UnitPrice { get; set; }
        public bool Discontinued { get; set; }
    }
    

    然后你需要一些东西来将string[] 翻译成MyObject

    private MyObject ConvertToMyObject(string[] values)
    {
        var myObject = new MyObject();
        myObject.ProductName = values[0];
        myObject.CategoryName = values[1];
        myObject.SupplierName = values[2];
    
        decimal unitPrice;
        if (decimal.TryParse(values[3], out unitPrice))
        {
            myObject.UnitPrice = unitPrice;
        }
    
        bool discontinued;
        if (boo.TryParse(values[4], out discontinued))
        {
            myObject.Discontinued = values[4];
        }
    }
    

    然后你可以在你的代码中使用那个方法然后绑定:

    protected void Page_Load(parameters here)
    {
        if (IsPostback)
        {
            var myObjects = new List<MyObject>();
            foreach (string[] values in items)
            {
                myObjects.Add(ConvertToMyObject(values));
            }
    
            ProductList.DataSource = myObjects;
            ProductList.DataBind();
        }
    }
    

    就像我在评论中所说,确保您可以在 Page_Load 事件处理程序中访问 items。另外,我是从记忆中输入的,忘记了Page_Load 中的参数。不过,您的代码中很可能已经有一个 Page_Load 处理程序。

    【讨论】:

      【解决方案3】:

      你可以试试这个

      List<string[]> items = List<string[]>();
      //add items to List
      
      GridView1.DataSource = items;
      GridView1.DataBind();
      

      你的 GridView

      <asp:GridView runat="server" ID="GridView1">
      <Columns>
      <asp:TemplateField>
      <ItemTemplate>
         <asp:Label ID="stringLabel" Text="<%# Container.DataItem %>" runat="server"></asp:Label>
      </ItemTemplate>
      </asp:TemplateField>
      </Columns>
      </asp:GridView>
      

      【讨论】:

        猜你喜欢
        • 2011-04-20
        • 2018-04-16
        • 1970-01-01
        • 2014-09-09
        • 1970-01-01
        • 2018-01-07
        • 2012-07-29
        • 2017-01-26
        • 2018-10-20
        相关资源
        最近更新 更多