【发布时间】: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