【发布时间】:2012-09-15 14:07:52
【问题描述】:
首先,我选择页面加载时的所有记录,如下所示:
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) 中,我像这样在 CommandArgument 中传递 MemID:
<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。 (即SELECT * FROM MyTable 的前 1 个MemID)。所以在绑定实际的 DataSource 之前,我像这样清除 GridView:
gvTemp.DataSource = null;
gvTemp.DataBind();
gvTemp.DataSource = dtTemp;
gvTemp.DataBind();
但我仍然收到旧数据源的e.CommandArgument。那么我错过了什么?或者有没有其他方法可以达到同样的效果?
【问题讨论】:
-
您在
objCmd.Parameters.Add(myParam);中传递的myParam的值是多少? -
试试 Refresh() 或 .ResetBindings 可能会解决
-
@prashanth 我从方法参数中得到它的价值。
-
@GyanChandraSrivastava 不是
Refresh()和ResetBinding()是DataGridView的方法。我这里有GridView。