【问题标题】:binding grid view on button click in listview在列表视图中单击按钮上的绑定网格视图
【发布时间】:2015-01-13 09:42:15
【问题描述】:

我有一个列表视图,每行都有一个按钮:

 <td> <asp:Button ID="Button2" runat="server" Text="select" CommandName="view" CommandArgument='<%# Eval("inquiry_id")%>'   onclick="buttonClick"/></td>

单击此按钮时,我会检索单击行的 id,使用相同的 id 设置会话并绑定网格视图。这是在列表视图中单击按钮后面的代码:

ListViewItem item = (sender as Button).NamingContainer as ListViewItem;
    Button butDetails = (Button)item.FindControl("Button2");
    Int64 inquiryID = Convert.ToInt64(butDetails.CommandArgument);
    Session["session_view_id"] = inquiryID;
    this.BindGrid();               
    return;

在 bindGrid 函数中检索会话。但问题是 gridview 在第一次单击时不显示,但在第二次单击时它会显示,但单击前一个 id 的数据。会话已设置,但在绑定网格时它使用旧会话值。我在哪里绑定网格出错了? bindGrid() 函数的代码是:

 int inquiryID = Convert.ToInt32(Session["session_view_id"]);
   MySqlConnection conn = null;
    try
    {          MySqlCommand cmd = new MySqlCommand("SELECT * FROM crm_support_inquiry inner join  crm_inquiry_perticipant on crm_support_inquiry.inquiry_id=?id inner join crm_mailer_types on crm_support_inquiry.mailer_id=crm_mailer_types.mailer_id limit 4", connect);

        using (MySqlDataAdapter sda = new MySqlDataAdapter())
        {
            cmd.Parameters.AddWithValue("?id", inquiryID);
            cmd.Connection = connect;
            sda.SelectCommand = cmd;
            using (DataTable dt = new DataTable())
           {

               sda.Fill(dt);
                lblComp.Text = dt.Rows[0]["company"].ToString();
                lblCname.Text = dt.Rows[0]["contact_name"].ToString();
              lblEmail.Text = dt.Rows[0]["email"].ToString();
                GridView1.DataSource = dt;
                GridView1.DataBind();
           }
        }

【问题讨论】:

  • 您是否检查过调试您的BindGrid() 方法以查看它是如何被调用的?
  • (这不是相关的答案)Button butDetails = (Button)item.FindControl("Button2"); 没有必要,Button butDetails = (sender as Button);
  • 是的。我调试了。它得到了正确的值,但是在显示时它显示了以前id的数据。
  • 在按钮点击它得到正确的ID。并且会话还保存了 id。当我调试时,传递给gridview的id也是正确的,但是在显示gridview时它显示了以前id的数据。可能绑定迟了。
  • 我建议查看 ASP.NET 的页面生命周期。一个肮脏的快速修复可能是在设置 session_view_id 后执行 Response.Redirect 到同一页面。这将使页面重新加载,并且由于 session_view_id 保存在会话中,它将在调用 BindGrid 方法时使用它。

标签: c# asp.net


【解决方案1】:

您是否在 Page_Load 方法中检查 IsPostBack?您需要在 if(!IsPostBack) 语句中将 Page_Load 中的 BindGrid 调用包装起来,以防止 Page_Load 最初在回发时刷新数据。这可以防止您稍后在事件处理程序中进行更改。

protected void Page_Load(Object sender, EventArgs e)
{
    if(!IsPostBack)
    {
        BindGrid();
    }
}

这个答案可以提供更多信息:How to update page data after event handling?

【讨论】:

  • 我的列表视图位于更新面板内容模板中。这会影响回发吗??
  • 但是应该显示gridview的点击按钮在listview内,而listview在更新面板内。
  • 如果网格不在更新面板中,则无法在异步回发(更新面板执行的回发类型。您需要将网格放在同一更新面板中或它自己的。如果你把它放在自己的,你可以通过调用 GridUpdatePanelName.Update() 来更新它。有关更多信息,请参阅此处:stackoverflow.com/questions/13701338/…
  • 感谢 ThoBa 现在可以正常工作了。我将网格放在另一个更新面板中并设置了 UpdateMode="Always"。非常感谢。
猜你喜欢
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
相关资源
最近更新 更多