2012-02-23 4 views
2

как бы изменить значение IBM на нечто вроде Cisco в одном из перечисленных событий gridview?изменить значение datarow для определенного столбца gridview

могут быть разные столбцы в динамическом gridview, поэтому было бы неплохо обратиться к столбцу по имени.

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

Смежные вопросы