2012-10-18 49 views
3

我有一個List<string[]> items列表填充我的代碼中的字符串數組。在ASPX頁面,我添加了一個新的網格視圖控件:如何從代碼填充asp:GridView?

<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的字符串數組列表。你能幫我填充網格視圖嗎?根本不需要通過綁定來完成。謝謝!

回答

5

你甚至不需要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(); 
0

編輯:您必須更改一些此代碼以符合您的需求。我根據您提供的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處理程序。

0

你可以試試這個

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>