【问题标题】:Not able to clear the last data-source of GridView无法清除 GridView 的最后一个数据源
【发布时间】: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

标签: c# asp.net gridview


【解决方案1】:

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

试试这样的:

if(!IsPostBack)
   //Your code or method for selecting all records.

【讨论】:

    【解决方案2】:

    您为什么不简单地删除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();
        }
    }
    

    【讨论】:

    • 其实AddMem.aspx是另一个页面。我想通过的地方MemID
    猜你喜欢
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    相关资源
    最近更新 更多