【问题标题】:How to hide a control inside user control after click gridview button单击gridview按钮后如何隐藏用户控件内的控件
【发布时间】:2014-03-28 03:12:49
【问题描述】:

这是这几天困扰我的问题

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

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

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

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

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

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

更新面板外的用户控件也是如此。逻辑类似

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

我什至尝试使用不同的控件,例如占位符、面板等。但仍然不起作用 我也跟踪代码。 pre_render 事件发生在 row 命令之后。 dontshow 变量为假。 (li) 控件可见设置为 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";

     }
}

【问题讨论】:

  • 而不是在 Page_PreRender 中设置 Visible 属性,为什么不在 gridview_RowCommand 中进行呢?那么你就不需要使用会话变量了。
  • 谢谢,我试着在 RowCommand 上做,但还是不行。顺便说一句,我需要存储在 Session 中,因为当我们导航到其他页面时,我们会知道条件的状态来确定是否显示。还有其他建议吗?
  • 你能展示一些你是怎么做的代码吗?
  • 按照您的建议,我将 li1.visible = false(或 true)语句移至 gridview_RowCommand。那没有用。我不知道为什么。在 page_load 事件之后设置可见似乎为时已晚。最终,我编写了 jquery 来更改可见属性。我必须在 row_command 中做。那种失败的目的。我想在用户控制中做到这一点。到目前为止,它一直在工作。我会交叉手指
  • 好的。如果“li1”控件不是 gridview 的一部分,请在后面的“li1”用户控件代码中尝试类似下面的内容。受保护的覆盖无效 OnLoad(EventArgs e) { base.OnLoad(e); if (Session["dontshow"] != null) { if ((bool)Session["dontshow"]) li1.visible = false else li1.visible = true } }

标签: asp.net


【解决方案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;
    }
}

希望这会有所帮助:-)

【讨论】:

  • 请注意,如果您使用 rowcommand,您应该使用您在网格视图中使用的按钮类型进行投射。我假设你使用了 ImageButton
  • 非常感谢。事实上,这就是我现在正在做的事情。我不断在 aspx 中添加用户控制代码。它工作得很好。问题是我发现越来越多的用户控件有同样的问题。我不断补充。我仍然希望我可以在用户控制中做到(更易于管理),但至少你的建议将帮助我在明天的发布中存活下来。我真的很感谢你的帮助。我仍然会挖掘用户控制解决方案,以防万一我不能在其他用户控制上做到这一点。再次感谢您一直以来的帮助
  • 很高兴!让我确切地知道您要做什么,然后我可以阐明一些情况。祝你发布一切顺利!
  • 如果它解决了你的问题,请接受这个作为答案
  • 好的,不用担心。如果您发布您的 ascx(用户控制)代码,并且它是背后的代码,我可以看看您是如何做到的。并且,确保在加载后调用用户控件的 Update() 方法。而且,您需要在更新面板中设置一些属性,例如 UpdateMode 和 EnableViewState。让我们先看看你的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
相关资源
最近更新 更多