2012-02-23 146 views
2

如何將IBM值更改爲思科在某個列表中的gridview事件中的任意值?修改特定gridview列的datarow值

在動態網格視圖中可以有不同的列,所以很容易按名稱對列進行處理。

namespace WebApplication1 
{ 
    public partial class _Default : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      DataTable dt = new DataTable("TestTable"); 
      dt.Columns.AddRange(new DataColumn[] { new DataColumn("id"), new DataColumn("customername") }); 
      DataRow dr = dt.NewRow(); 
      dr[0] = "1"; 
      dr[1] = "Microsoft"; 
      dt.Rows.Add(dr); 

      DataRow dr2 = dt.NewRow(); 
      dr2[0] = "2"; 
      dr2[1] = "IBM"; 
      dt.Rows.Add(dr2); 

      GridView1.DataSource = dt; 
      GridView1.DataBind(); 

     } 

     protected void GridView1_DataBinding(object sender, EventArgs e) 
     { 

     } 

     protected void GridView1_DataBound(object sender, EventArgs e) 
     { 

     } 

     protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
     { 

     } 

     protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e) 
     { 

     } 
    } 
} 

回答

2

AutogenerateColumns設置爲true(默認),這是行不通的。您需要以編程方式或以聲明方式添加列(以aspx標記)。然後你可以使用一個TemplateField與像Label一個控制,你可以在代碼隱藏參考:

例如:

<asp:GridView ID="GridView1" AutoGenerateColumns="false" OnRowDataBound="GridView1_RowDataBound" runat="server"> 
    <Columns> 
     <asp:TemplateField HeaderText="Customer"> 
      <ItemTemplate> 
       <asp:Label ID="LblCustomer" runat="server"></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

RowDataBound是完美的(幾乎所有):

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if(e.Row.RowType == DataControlRowType.DataRow) { 
     var row = ((DataRowView)e.Row.DataItem).Row; 
     var lblCustomer = (Label)e.Row.FindControl("LblCustomer"); 
     var customerName = row.Field<String>("customername"); 
     if(customerName == "Microsoft") { 
      customerName = "Cisco"; 
     } 
     lblCustomer.Text = customerName; 
    } 
} 

編輯:好的,從不需要這樣做。但實際上,您可以將Microsoft值更改爲Cisco即使將AutoGenerateColumns設置爲true

DataBinding事件在GridView被數據綁定之前觸發。如果更改了數據源之前,它一定格,你就可以對其進行修改:

protected void GridView1_DataBinding(object sender, EventArgs e) 
{ 
    var tbl = (DataTable)((GridView)sender).DataSource; 
    var msRows = tbl.AsEnumerable() 
     .Where(r => r.Field<String>("customername") == "Microsoft") 
     .Select(r => r); 
    foreach(DataRow msRow in msRows) { 
     msRow[ "customername" ] = "Cisco"; 
    } 
} 

注:當然,你也可以使用一個簡單的循環,而不是LINQ