2009-08-20 47 views
3

(MySQLデータベースにバインドされている)にバインドされたASP.NET GridViewがあります。このグリッドでは、サーバー側のイベントをトリガーする2つのアンバウンドButtonField列があります。したがって、GridViewRowCommandイベントにイベントハンドラメソッドを追加しました。ASP.NET GridViewからDataRowを取得

上記イベントハンドラのコードでは、ユーザがクリックした基になるDataRowを何とか保持する必要があります。しかし、私はこれを動作させるように見えることはできません。私は、次のselectedRow変数のようなコードを使用している場合、常にnullです:

protected void searchResultsGridView_RowCommand(object sender, GridViewCommandEventArgs e) 
{ 
    CallDataRow selectedRow = (CallDataRow) searchResultsGridView.Rows[Convert.ToInt32(e.CommandArgument)].DataItem; 
} 

私はGoogleで検索して、そのようなhttp://ranafaisal.wordpress.com/2008/03/31/how-to-get-the-current-row-in-gridview-row-command-eventなどのページを見つけましたが、私が見つけたものは何も働いていないきました。私はちょうど何かを明らかに欠けているかなり確信しているが、私は何を把握することはできません...

それは場合に役立ちます。ここASP.NETコードだ:

最後になった
<asp:GridView ID="searchResultsGridView" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="PersonNo,CallDate" 
    Width="100%" AllowPaging="True" EnableSortingAndPagingCallbacks="True" 
    onrowcommand="searchResultsGridView_RowCommand" PageSize="20"> 
    <Columns> 
     <asp:BoundField DataField="PersonNo" HeaderText="Account number" ReadOnly="True" 
     SortExpression="PersonNo" /> 
     <asp:BoundField DataField="AgentNo" HeaderText="Agent number" 
     SortExpression="AgentNo" /> 
     <asp:BoundField DataField="AgentName" HeaderText="Agent name" 
     SortExpression="AgentName" /> 
     <asp:BoundField DataField="TelNumber" HeaderText="Telephone number" 
     SortExpression="TelNumber" /> 
     <asp:BoundField DataField="CallDate" HeaderText="Call date/time" ReadOnly="True" 
     SortExpression="CallDate" /> 
     <asp:ButtonField CommandName="play" HeaderText="Audio" ShowHeader="True" 
     Text="Play" /> 
     <asp:ButtonField CommandName="download" Text="Download" /> 
    </Columns> 
    </asp:GridView> 

答えて

4

  1. バインドされたHiddenFieldを含むTemplateFieldを追加します。

    <asp:TemplateField ShowHeader="False"> 
        <ItemTemplate> 
        <asp:HiddenField ID="audioFileName" runat="server" Value='<%# Eval("AudioFileName") %>' /> 
        </ItemTemplate> 
    </asp:TemplateField> 
    
  2. RowCommandイベントハンドラに次のコードを追加:

    protected void searchResultsGridView_RowCommand(object sender, GridViewCommandEventArgs e) 
    { 
        string audioFile = ((HiddenField) searchResultsGridView.Rows[Convert.ToInt32(e.CommandArgument)].FindControl("audioFileName")).Value; 
    } 
    

それはcludgeだし、特に安全ではないのですが、それは動作し、それは私が今、必要なすべてのです。任意のより良い解決策は、まだ私は(申し訳ありません!...の前にそれを見ていない)、これは5年遅れている実感が、私は直接行を変換するために、2つの静的/共有メソッドを使用して...しかし

+0

***隠しフィールド***なしで他のソリューションを試しましたか? – Kiquenet

1
int index = Convert.ToInt32(e.CommandArgument); 

GridViewRow row = searchResultsGridView.Rows[index]; 
+0

<asp:GridView ID="gridview" runat="server" ... DataKeyNames="pkey"> protected void gridview_OnRowCommand(object sender, EventArgs e) { string selectedPkey = null; GridViewCommandEventArgs gridEvent = (GridViewCommandEventArgs)e; int index = Convert.ToInt32(gridEvent.CommandArgument); if (index >= 0 && index < gridview.Rows.Count) { GridViewRow r = gridview.Rows[index]; selectedPkey = gridview.DataKeys[index].Value.ToString(); } 
に適用されていることを確認するために使用することができます== DataRowとDataItem == null。基になるDataRowを保持する必要があるのはDataItemなので、この場合DataItemはnullですが、これは答えではありません。 –

+0

あなたは 'RowCommand' ***または*** RowDataBound'で試しましたか? – Kiquenet

1

を歓迎しています。多分、これはあなたがやろうとしていることでしょうか?

VB.Net:

Public Shared Function GridViewRowToDataRow(ByVal gvr As GridViewRow) As DataRow 
    Dim di As Object = Nothing 
    Dim drv As DataRowView = Nothing 
    Dim dr As DataRow = Nothing 

    If gvr IsNot Nothing Then 
     di = TryCast(gvr.DataItem, System.Object) 
     If di IsNot Nothing Then 
      drv = TryCast(di, System.Data.DataRowView) 
      If drv IsNot Nothing Then 
       dr = TryCast(drv.Row, System.Data.DataRow) 
      End If 
     End If 
    End If 

    Return dr 
End Function 

Public Shared Function GridViewRowEventArgsToDataRow(ByVal e As GridViewRowEventArgs) As DataRow 
    Dim gvr As GridViewRow = Nothing 
    Dim di As Object = Nothing 
    Dim drv As DataRowView = Nothing 
    Dim dr As DataRow = Nothing 

    If e.Row.RowType = DataControlRowType.DataRow Then 
     gvr = TryCast(e.Row, System.Web.UI.WebControls.GridViewRow) 
     dr = Helpers.GridViewRowToDataRow(gvr) 
    End If 

    Return dr 
End Function 

C#。ネット(使用して変換:http://www.developerfusion.com/tools/convert/vb-to-csharp/):

public static DataRow GridViewRowToDataRow(GridViewRow gvr) 
{ 
    object di = null; 
    DataRowView drv = null; 
    DataRow dr = null; 

    if (gvr != null) { 
     di = gvr.DataItem as System.Object; 
     if (di != null) { 
      drv = di as System.Data.DataRowView; 
      if (drv != null) { 
       dr = drv.Row as System.Data.DataRow; 
      } 
     } 
    } 

    return dr; 
} 

public static DataRow GridViewRowEventArgsToDataRow(GridViewRowEventArgs e) 
{ 
    GridViewRow gvr = null; 
    object di = null; 
    DataRowView drv = null; 
    DataRow dr = null; 

    if (e.Row.RowType == DataControlRowType.DataRow) { 
     gvr = e.Row as System.Web.UI.WebControls.GridViewRow; 
     dr = Helpers.GridViewRowToDataRow(gvr); 
    } 

    return dr; 
} 
+0

void GridResultados_RowCommand(オブジェクト送信者、GridViewCommandEventArgs e)イベントで使用することはできません。 – Kiquenet

1

私も後にパーティによ!私はGoogleからのここに来たとしてではなく、一部の人々はまだ、私は私の答えを与えるでしょう、したがって、これを打つことがあります。

protected void SomeDataGrid_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     System.Data.DataRowView dr = (System.Data.DataRowView)e.Row.DataItem; 
     string aVar = dr["DataFieldIdLikePlease"].ToString(); 
    } 
} 

それでは、あなたが得る分離コード内のデータフィールドのいずれかを取得することができます。これを行うには

+2

'RowCommand'は***ではありません*** RowDataBound'? – Kiquenet

0

きれいな方法は、GridViewの上で「DataKeyNames」プロパティを使用しているようです。データソースには、一意の識別子または主キーである列が含まれている必要があります。 GridviewのDataKeyNamesプロパティをそのプロパティの名前に設定することができます。

選択された行に対応する列の値がRowCommandで利用可能であり、コマンドが私ROWTYPEとGridViewRowを与える一意に識別されたオブジェクト

関連する問題