Domanda

Ho un GridView ASP.NET che è associato a un ObjectDataSource (che è destinato a un database MySQL). Su questa griglia, ho 2 colonne ButtonField non associate che voglio attivare eventi sul lato server. Quindi ho aggiunto un metodo EventHandler all'evento GridView del RowCommand.

Nel codice di detto EventHandler, ho bisogno di ottenere in qualche modo in possesso del DataRow sottostante che è stato cliccato dall'utente. Tuttavia, non riesco a ottenere questo al lavoro; se uso il codice come il seguente la variabile selectedRow è sempre null:

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

Googled e trovato come http://ranafaisal.wordpress.com/2008/03/31/how-to-get-the-current-row-in-gridview-row-command-event , ma nulla ho trovato ha funzionato. Sono abbastanza sicuro che io sono solo manca qualcosa di ovvio, ma non riesco a capire cosa ...

Ecco il codice ASP.NET se questo aiuta:

  <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>
È stato utile?

Soluzione

finalmente riusciti a farlo funzionare nel modo seguente:

  1. Aggiunta di un TemplateField contenente un HiddenField legato.

    <asp:TemplateField ShowHeader="False">
      <ItemTemplate>
        <asp:HiddenField ID="audioFileName" runat="server" Value='<%# Eval("AudioFileName") %>' />
      </ItemTemplate>
    </asp:TemplateField>
    
  2. aggiungendo il seguente codice nel gestore di eventi RowCommand:

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

E 'un cludge e non è particolarmente sicura, ma funziona e questo è tutto quello che serve in questo momento. Tutte le soluzioni migliori sono ancora benvenuti anche se ...

Altri suggerimenti

Sono anche più tardi alla festa! Ma, come sono arrivato qui da Google, alcune persone possono ancora colpire questo, quindi, ti darò la mia risposta:

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

Quindi, allora si ottiene può ottenere uno qualsiasi dei campi di dati nella codebehind.

Mi rendo conto che è di 2,5 anni di ritardo (mi dispiace! Non ho visto prima ...), ma io uso due metodi statici / condivise per convertire direttamente la riga. Forse è questo che stai cercando di fare?

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 # .Net (fabbricato utilizzando: http: //www.developerfusion. com / strumenti / convertire / 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;
}
 int index = Convert.ToInt32(e.CommandArgument);

 GridViewRow row = searchResultsGridView.Rows[index];

Un modo pulito per fare questo sembra essere utilizzare per la proprietà "DataKeyNames" sul GridView. L'origine dati deve contenere una colonna che è un identificatore univoco o chiave primaria. Quindi è possibile impostare la proprietà DataKeyNames sul GridView per essere il nome di quella proprietà.

Il valore della colonna corrispondente alla riga selezionata è quindi disponibile nel RowCommand e può essere utilizzato per assicurarsi che il comando viene applicato all'oggetto identificato univocamente

<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();
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top