2

首先,我选择页面加载上的所有记录,如下所示:

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) 中,我是这样传入MemIDCommandArgument

<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();
}

执行此查询,我只得到一条记录。当我点击时StartgvTemp_RowCommand被解雇。但我正在e.CommandArgument使用旧的数据源。(即 的前 1MemIDSELECT * FROM MyTable)。因此,在绑定实际 DataSource 之前,我像这样清除 GridView:

gvTemp.DataSource = null;
gvTemp.DataBind();
gvTemp.DataSource = dtTemp;
gvTemp.DataBind();

但我仍然在e.CommandArgument使用旧的数据源。那么我错过了什么?或者有没有其他方法可以达到同样的效果?

4

2 回答 2

3

在每个按钮单击时都会发生回发并发生页面加载事件,因此在您的情况下,这可能是加载先前数据源的原因。所以你必须检查 IsPostBack 条件。

尝试这样的事情:

if(!IsPostBack)
   //Your code or method for selecting all records.
于 2012-09-24T06:12:57.857 回答
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();
    }
}
于 2012-09-24T06:18:08.703 回答