这是困扰我过去几天的问题
我有一个包含几个用户控件的页面。
在该页面上,有一个网格。如果用户单击特定行,则根据条件显示或隐藏用户控件上的控件(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";
}
}
答案 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;
}
}
希望这会有所帮助: - )