首先,我选择页面加载上的所有记录,如下所示:
OleDbCommand objCmd = new OleDbCommand("SELECT * FROM MyTable", mycon);
objCmd.CommandType = CommandType.Text;
DataTable dtTemp = new DataTable();
OleDbDataReader rd = objCommand.ExecuteReader();
if (rd.HasRows)
{
dtTemp.Load(rd);
gvTemp.DataSource = dtTemp;
gvTemp.DataBind();
}
在 GridView( gvTemp
) 中,我是这样传入MemID
的CommandArgument
:
<asp:TemplateField HeaderText="Action" ItemStyle-Width="80px">
<ItemTemplate>
<asp:LinkButton ID="lbtnStart" runat="server" CommandArgument='<%# Eval("MemID") %>' CommandName="Start">Start</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
所以当我点击Start
,gvTemp_RowCommand
被触发并且我想得到CommandArgument
( MemID
) 。所以我这样做是为了实现它:
protected void gvTemp_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Start")
{
Response.Redirect("AddMem.aspx?MemID=" + e.CommandArgument.ToString());
}
}
这工作很好。但问题就在这里。
当用户搜索特定记录时,我会gvTemp
像这样重新加载:
OleDbCommand objCmd = new OleDbCommand("SELECT * FROM MyTable WHERE MemID = ?", mycon);
objCmd.Parameters.Add(myParam);
objCmd.CommandType = CommandType.Text;
DataTable dtTemp = new DataTable();
OleDbDataReader rd = objCommand.ExecuteReader();
if (rd.HasRows)
{
dtTemp.Load(rd);
gvTemp.DataSource = dtTemp;
gvTemp.DataBind();
}
执行此查询,我只得到一条记录。当我点击时Start
,gvTemp_RowCommand
被解雇。但我正在e.CommandArgument
使用旧的数据源。(即 的前 1MemID
个SELECT * FROM MyTable
)。因此,在绑定实际 DataSource 之前,我像这样清除 GridView:
gvTemp.DataSource = null;
gvTemp.DataBind();
gvTemp.DataSource = dtTemp;
gvTemp.DataBind();
但我仍然在e.CommandArgument
使用旧的数据源。那么我错过了什么?或者有没有其他方法可以达到同样的效果?