无法清除GridView的最后一个数据源

时间:2012-09-24 05:53:00

标签: c# asp.net gridview

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

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被触发,我想获得CommandArgumentMemID)。所以我这样做是为了实现它:

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。那我错过了什么?或者有没有其他方法来实现相同的目标?

2 个答案:

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