2012-03-15 246 views
35

asp.netでgridviewを使用していますが、今度はセルの値をセルのインデックスではなく列の名前で欲しいです。asp.netのGridViewで列名でセルの値を取得する方法

どのようにそれはそれはそれはそれらのものを知ってdatasourceプロパティのだとして、列名として機能していないセルの列名によって

+0

いつ値を入力しますか?グリッドがページにレンダリングされる前に、または送信後に? – balexandre

+0

提出後 –

答えて

57

GridViewをセルの値を取得することにより可能です。

カラム名が指定されたインデックスをまだ知っている必要がある場合は、gridviewヘッダーに通常この情報が含まれているため、これを行うヘルパーメソッドを作成できます。

int GetColumnIndexByName(GridViewRow row, string columnName) 
{ 
    int columnIndex = 0; 
    foreach (DataControlFieldCell cell in row.Cells) 
    { 
     if (cell.ContainingField is BoundField) 
      if (((BoundField)cell.ContainingField).DataField.Equals(columnName)) 
       break; 
     columnIndex++; // keep adding 1 while we don't have the correct name 
    } 
    return columnIndex; 
} 

その後、同じように使用...上記のコードはBoundFieldを使用することを覚えている:私は強くあなたがあなた自身のコントロールを持っているTemplateFieldを使用することを示唆している

protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     int index = GetColumnIndexByName(e.Row, "myDataField"); 
     string columnValue = e.Row.Cells[index].Text; 
    } 
} 

、それはに簡単です以下のようにこれらのコントロールをつかむ:

<asp:GridView ID="gv" runat="server"> 
    <Columns> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <asp:Label ID="lblName" runat="server" Text='<%# Eval("Name") %>' /> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

してから使用し

string columnValue = ((Label)e.Row.FindControl("lblName")).Text; 
その長い時間がなく、このコードの比較的小さな作品は読んで入手しやすいようです
+0

これは救命救助者です!ありがとう – Artin

+0

合意。生命保険会社。ありがとう!これは私の「ユーティリティの小さなバッグ」に入っています – pStan

+0

@balexandreもしそれがTemplateFieldならどうですか? BoundFieldとTemplateFieldの両方を一列に並べています。 –

2

:あなたは列のインデックスを取得するにはDataRowViewを使用することができます

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    int index; 
    string cellContent; 

    foreach (TableCell tc in ((GridView)sender).HeaderRow.Cells) 
    { 
     if(tc.Text.Equals("yourColumnName")) 
     { 
     index = ((GridView)sender).HeaderRow.Cells.GetCellIndex(tc); 
     cellContent = ((GridView)sender).SelectedRow.Cells[index].Text; 
     break; 
     } 
    } 
} 
2

ラムダ愛好家のための
void OnRequestsGridRowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      var data = e.Row.DataItem as DataRowView; 

      // replace request name with a link 
      if (data.DataView.Table.Columns["Request Name"] != null) 
      { 
       // get the request name 
       string title = data["Request Name"].ToString(); 
       // get the column index 
       int idx = data.Row.Table.Columns["Request Name"].Ordinal; 

       // ... 

       e.Row.Cells[idx].Controls.Clear(); 
       e.Row.Cells[idx].Controls.Add(link); 
      } 
     } 
    } 
2

protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     var boundFields = e.Row.Cells.Cast<DataControlFieldCell>() 
      .Select(cell => cell.ContainingField).Cast<BoundField>().ToList(); 

     int idx = boundFields.IndexOf(
      boundFields.FirstOrDefault(f => f.DataField == "ColName")); 

     e.Row.Cells[idx].Text = modification;   
    } 
} 
0

アレキサンダーの答えでindexcolumnと小さなバグ: 私たちは、 "見つからない" 欄の世話をする必要があります。

int GetColumnIndexByName(GridViewRow row, string columnName) 
{ 
    int columnIndex = 0; 
    int foundIndex=-1; 
    foreach (DataControlFieldCell cell in row.Cells) 
    { 
     if (cell.ContainingField is BoundField) 
     { 
      if (((BoundField)cell.ContainingField).DataField.Equals(columnName)) 
      { 
       foundIndex=columnIndex; 
       break; 
      } 
     } 
     columnIndex++; // keep adding 1 while we don't have the correct name 
    } 
    return foundIndex; 
} 

protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     int index = GetColumnIndexByName(e.Row, "myDataField"); 
     if(index>0) 
     { 
      string columnValue = e.Row.Cells[index].Text; 
     } 
    } 
} 
0

Code Project

グリッドのデータソースに基づいてデータテーブルが宣言されたら、columnsコレクションの列名で列インデックスを参照します。この時点で、必要に応じてインデックスを使用して、セルの情報を取得したり、セルをフォーマットしたりします。

protected void gridMyGrid_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     DataTable dt = (DataTable)((GridView)sender).DataSource; 
     int colIndex = dt.Columns["MyColumnName"].Ordinal; 

     e.Row.Cells[colIndex].BackColor = Color.FromName("#ffeb9c"); 
    } 
} 
+0

単純なコードを投稿しないでください。解決策を説明してください。 –

関連する問題