如何在单击gridview按钮后隐藏用户控件内的控件

时间:2014-03-28 03:12:50

标签: asp.net

这是困扰我过去几天的问题

我有一个包含几个用户控件的页面。

在该页面上,有一个网格。如果用户单击特定行,则根据条件显示或隐藏用户控件上的控件(li)。

使事情变得复杂的是用户控件和网格网格都在更新面板内,但另一个用户控件在updaet面板之外

在rowcommand事件中,我分配了一个Session变量dontshow。根据标准,dontshow变量将被赋值为true或false。然后将根据dontshow条件显示或隐藏对用户控件的控制

到目前为止,我遇到了这个问题。

让我们说(li)显示控件,但在用户单击gridview后,dontshow设置为true。 (li)控制应隐藏。不,不是的。我必须单击其他按钮才能进行回发以实现它

更新面板外的usercontrol也是如此。逻辑相似

在过去的几天里,我发现我无法在page_load的用户控件中设置控件的可见属性,因为这发生在rowcommand事件之后。我将代码移动到pre_render事件

我甚至尝试使用不同的控件,例如占位符,面板等。这仍然不起作用 我还跟踪代码。 pre_render事件在row命令之后发生。 dontshow变量是假的。 (li)控件visible设置为false。但是,渲染后,我仍然可以看到控件

我该怎么办?

以下是代码的快照

感谢您的帮助

main.aspx

.....
<%@ Register Src="../usercontrol1.ascx" TagPrefix="uctest1" TagName="ctrl1" %>
<%@ Register Src="../usercontrol2.ascx" TagPrefix="uctest2" TagName="ctrl2" %>
...

<ctrl1:uctest1runat="server" ID="test1" />
<asp:UpdatePanel ID="updatepantest1" runat="server" UpdateMode="Always">
   <ContentTemplate>

      <uctest2:ctrl2runat="server" UpdateMode="Conditional" ID="test2" />
....

     <asp:GridView ...>
        //grid where rowcommand was executed
     </asp:GridView>
   </ContentTemplate>
</asp:UpdatePanel>

后面的main.aspx代码

protected void gridview_RowCommand(object sender, GridViewCommandEventArgs e)
{
  if (e.CommandName == "something")
  {
      .....
      if (x = 1)
        session["dontshow"] = true
      else
        session["dontshow"] = false
  }
}

用户控制aspx(usercontrol1)

...

 <ul>
  <li id="li1" runat="server">
    <asp:label>this is test</asp:label>
  </li>
  <li >
    <asp:label>this is test</asp:label>
  </li>
  <li >
    <asp:label>this is test</asp:label>
  </li>
</ul>

.... 用户控制代码(usercontrol1)

protected void Page_PreRender(object sender, EventArgs e)
{
    bool dontshow = false;
    if (Session["dontshow"] != null)
    {
       dontshow = (bool)Session["dontshow"]
    }
    if (dontshow)
      li1.visible = false
     else
      li1.visible = true
}

用户控制aspx(usercontrol2)

...

<asp:PlaceHolder ID="placeholder1" runat="server">
<asp:label ID="label1" runat="server"></asp:label>
</asp:PlaceHolder>

.... 用户控制代码(usercontrol2)

protected void Page_PreRender(object sender, EventArgs e)
{
    bool dontshow = false;
    if (Session["dontshow"] != null)
    {
       dontshow = (bool)Session["dontshow"]
    }
    if (dontshow)
    {
      label1.visible =false;
    }
     else
     {
       label1.visible =true;
       label1.Text ="this is test";

     }
}

1 个答案:

答案 0 :(得分:1)

你可以在你的Row命令中这样做

protected void gridview_RowCommand(object sender, GridViewCommandEventArgs e)
{
  if (e.CommandName == "something")
  {
      .....

    var viewRow = (GridViewRow)(((ImageButton)e.CommandSource).NamingContainer);
    HtmlGenericControl li1 = (HtmlGenericControl)viewRow.FindControl("li1");

      if (x = 1)
    {
            session["dontshow"] = true;
        li1.Visible = true;
    }
      else
    {
            session["dontshow"] = false;
        li1.Visible = false;
    }
  }
}

或者,如果你想在数据绑定期间隐藏控件,你可以这样做

protected void gridview_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        HtmlGenericControl li1 = (HtmlGenericControl)e.Row.FindControl("li1");

    if (dontshow)
            li1.visible = false;
        else
            li1.visible = true;
    }
}

希望这会有所帮助: - )