首先,我在页面加载中选择所有记录,如下所示:
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
旧的DataSource。 (即MemID
的前1 SELECT * FROM MyTable
)。所以在绑定实际的DataSource之前,我清除了GridView,如下所示:
gvTemp.DataSource = null;
gvTemp.DataBind();
gvTemp.DataSource = dtTemp;
gvTemp.DataBind();
但我仍然得到旧版DataSource的e.CommandArgument
。那我错过了什么?或者有没有其他方法来实现相同的目标?
答案 0 :(得分:3)
在每个按钮上单击发生回发并发生页面加载事件,因此在您的情况下,这可能是加载先前数据源的原因。所以你必须检查IsPostBack条件。
尝试这样的事情:
if(!IsPostBack)
//Your code or method for selecting all records.
答案 1 :(得分:0)
为什么不简单地删除Response.Redirect(itself)
并使用方法和属性?
private string MemID{
get { return (String)ViewState["MemID"]; }
set { ViewState["MemID"] = value; }
}
private void BindGrid()
{
// copy your sql,datasource and databind stuff here, use the MemID property for the parameter
}
protected void gvTemp_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Start")
{
MemID = e.CommandArgument.ToString());
BindGrid();
}
}