C# 从ASP.NET GridView获取数据行
我有一个ASP.NETC# 从ASP.NET GridView获取数据行,c#,asp.net,gridview,event-handling,datarow,C#,Asp.net,Gridview,Event Handling,Datarow,我有一个ASP.NETGridView,它绑定到一个ObjectDataSource(它绑定到一个MySQL数据库)。在这个网格中,我有两个未绑定的ButtonField列,我想触发服务器端事件。因此,我向GridView的RowCommand事件添加了一个eventhandler方法 在所述eventhandler的代码中,我需要以某种方式获得用户单击的底层DataRow。然而,我似乎无法让它发挥作用;如果使用如下代码,则selectedRow变量始终为null: protected void
GridView
,它绑定到一个ObjectDataSource
(它绑定到一个MySQL数据库)。在这个网格中,我有两个未绑定的ButtonField
列,我想触发服务器端事件。因此,我向GridView
的RowCommand
事件添加了一个eventhandler方法
在所述eventhandler的代码中,我需要以某种方式获得用户单击的底层DataRow
。然而,我似乎无法让它发挥作用;如果使用如下代码,则selectedRow
变量始终为null
:
protected void searchResultsGridView_RowCommand(object sender, GridViewCommandEventArgs e)
{
CallDataRow selectedRow = (CallDataRow) searchResultsGridView.Rows[Convert.ToInt32(e.CommandArgument)].DataItem;
}
我在谷歌上搜索并找到了类似的页面,但没有找到任何有效的页面。我很确定我只是错过了一些明显的东西,但我不知道是什么
以下是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>
通过执行以下操作,最终使其正常工作:
<asp:TemplateField ShowHeader="False">
<ItemTemplate>
<asp:HiddenField ID="audioFileName" runat="server" Value='<%# Eval("AudioFileName") %>' />
</ItemTemplate>
</asp:TemplateField>
这是一个棍棒,它不是特别安全,但它工作,这就是我现在需要的。任何更好的解决方案都是受欢迎的,尽管…我意识到这已经晚了2.5年(抱歉!以前没有看到…),但我使用两种静态/共享方法直接转换行。也许这就是你想要做的 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(使用转换为:):
我还没来得及参加聚会呢!但当我从谷歌来到这里时,有些人可能仍然会碰到这个问题,因此我将给出我的答案:
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();
}
}
因此,您可以获得codebehind中的任何数据字段。一种干净的方法似乎是使用GridView上的“DataKeyNames”属性。数据源应包含一列,该列是唯一标识符或主键。然后可以将gridview上的DataKeyNames属性设置为该属性的名称 然后,与选定行对应的列的值在RowCommand中可用,并可用于确保将该命令应用于唯一标识的对象
<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();
}
受保护的void gridview_onrow命令(对象发送方,事件参数e)
{
字符串selectedPkey=null;
GridViewCommandEventArgs gridEvent=(GridViewCommandEventArgs)e;
int index=Convert.ToInt32(gridEvent.CommandArgument);
如果(索引>=0&&index
这将为我提供一个RowType==DataRow和DataItem==null的GridViewRow。由于我需要它来获取基础DataRow,而DataItem在本例中为null,因此这不是答案。您是否尝试了没有隐藏字段的其他解决方案?无法在void GridResultados_row命令中使用(对象发送方,GridViewCommandEventArgs e)
event
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;
}
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();
}
}
<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();
}