Ottenere un DataRow da un ASP.NET GridView
-
19-09-2019 - |
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>
Soluzione
finalmente riusciti a farlo funzionare nel modo seguente:
-
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>
-
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();
}