日期:2014-05-16  浏览次数:20333 次

一个很现实的问题,刷新后保持控件刷新前的状态的问题!
一个很现实的问题,不知道大家都是怎么解决的.
问题:
在页面刷新的时候,记录一个图标的状态(是否显示,即display的值),显示上一次,即刷新前的状态.

以往的办法:
在页面中上有一个图标(id= "img001 "),把它设为runat= "server ".
同时在页面里放一个隐藏的服务器控件TextBox,记录这个状态值.
页面刷新,加载完成以后,调用后台方法,先通过FindControl找到这个图标,然后根据TextBox值,将Style[ "display "]   =   "none "或 " ";
这样就可以完成控制实现.

现在的问题:
这个图标放到了一个Repeater控件的循环体里,这样它ID是动态加载的:
<img   id= <%DataBinder.Eval(Container.DataItem, " ")%> >
现在的问题出来了:在VS2005中,runat= "server "控件的id只允许是简单的常量,这样当在上述的img标签里添加了runat= "server "以后,连编译都通不过了(如果单是跑在页面的,是没问题的).
在这种情况下,前面提到的方法就不可行了.

我还试了在   img   里写了onload()事件的脚本,在脚本里读取隐藏TextBox的值,然后比较ID,再控制其显示还是隐藏.但是,可惜,在onload()事件发生的时候,这个隐藏的服务器控件TextBox的值还没从ViewState里取过来(控件加载在先,数据加载在后).因此每次读取的值都是空的,自然无从比较.

现在我也想不出有什么好的办法可以实现刚才提到的问题了,请各位大狭帮我出出注意^^

------解决方案--------------------
在page_load里面写上

protected void Page_Load(object sender, EventArgs e)
{
try
{

if (!IsPostBack)
{
this.DriveTypeID = UtilTool.ToSafeInt32(Request.Params[ "ID "]);
this.BindDriveShow(1);
//this.BindDrive1Type();
//this.BindDrive2Type();
}
}
catch(Exception ex)
{
this.lblMessage.Text = ex.Message;
}
}

这样试试
------解决方案--------------------
如果改变状态后,没提交到服务器,就刷新了,这样当然是不能还原的,如果提交过后,就会保存在ViewState里的,这样你就可以记取出来再设置了
------解决方案--------------------
方法是改变状态的时候,修改某一隐藏域的值
------解决方案--------------------
我没有看你写的“现在的问题:”那一行以下的内容。

web控件本来就是自己保持Style状态的,你说它不能保存Style是没有道理的。
例如:

<asp:Image ID= "Image1 " runat= "server " ImageUrl= "http://www.google.com/images/google_sm.gif " />
<br />
<asp:Button ID= "Button1 " runat= "server " Text= "改变Visible属性 " OnClick= "Button1_Click " />
<br />
<asp:Button ID= "Button2 " runat= "server " Text= "改变display样式 " OnClick= "Button2_Click " /> <br />
<asp:Button ID= "Button3 " runat= "server " Text= "什么也不做 " />


protected void Button1_Click(object sender, EventArgs e)
{
this.Image1.Visible = !this.Image1.Visible;
}

protected void Button2_Click(object sender, EventArgs e)
{
this.Image1.Style[ "display "] =
this.Image1.Style[ "display "] == "none " ? "inline " : "none ";
}

protected void Page_Load(object sender, EventArgs e)
{
this.SmartNavigation = true;
}

执行之后可以看到,控件在被动刷新的时候,其display样式总是服务器端正确设置的。

除非你有在问题中没有说过的操作需求,否则根本用不着为display保持刷新前的状态担心。
------解决方案--------------------
我的图标的动态加载的,每次刷新都加载一遍(放在repeater控件里),当然ID还是一样的.
——————————————————————————————————————————
动态加载是完全一样的。

我把例子改了一下:

<asp:PlaceHolder ID= "PlaceHolder1 " runat= "server "> </asp:PlaceHolder>
<br />
<asp:Button ID= "Button1 " runat= "server " Text= "改变Visible属性 " OnClick= "Button1_Click " />