2012-02-23 11 views
2

リストされたgridviewイベントのいずれかでCiscoのような任意の値にIBMを変更するにはどうすればよいですか?特定のグリッドビュー列の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

AutogenerateColumnstrue(デフォルト)に設定されている場合、これは動作しません。あなたは列をプログラム上または宣言的に(aspxマークアップで)追加する必要があります。

例えば:次に、あなたが分離コード内で参照できるLabelのようなコントロールとTemplateFieldを使用することができます

<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; 
    } 
} 

編集:これは決して必要ありません。しかし、実際にの値をAutoGenerateColumnstrueに設定しても、Ciscoに変更することができます。

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

の単純なループを使用することができます
関連する問題