关于页面动态添加控件

  最近看到很多问题都是关于页面动态添加控件,页面postback以后,就取不到这些控件了。 其实每次在页面上动态添加控件(或者在数据控件上动态添加列),它们的状态是不会被添加到页面的ViewState中去的,所以每次回送回来,它们就消失了,程序员只能手动把这些控件再次添加到页面上来,才会还原它们的状态。
  实在惭愧,上面的说法是错误的,由于自己没有理解该机制,幸亏sp1234大哥及时指出,要不然以后还会犯错误,以后学习切忌浮躁。下面就是他的话:
“他们的状态都在ViewState中,并且asp.net也会尝试恢复状态。只不过,对于文章中的那种情况,“尝试恢复状态”失败,所以无法显示出来那 10个动态装载的控件的样子。但是,如果把这个说成是ViewState中没有他们的状态,是不了解机制的实质的错误推论。状态数据都在,例如 TextBox的Text、MaxLength属性等都保存在ViewState中,但是没有在page_load结束前重建这些状态所依附的控件(根据 UniqueID来唯一决定控件,因此给动态产生的控件设置id属性最重要),所以asp.net没有地方把状态放回控件。

控件从来不会放入ViewState。如果你在页面设计时放置一个控件,那么页面每一次实例化的时候都会重新根据设计代码所编译出的可执行代码,重新创建这个控件。而如果你在页面运行时动态产生一个控件,就要保证下一次页面page_load结束之前自己的代码中重建这个控件(因为page_load之后 asp.net会立刻给这个控件装载状态)。”
        
  MSDN上提供了一种参考的方式,override页面的LoadViewState方法,因为该方法调用是在page_load事件之前,它可以保证这些动态控件在事件处理函数里面是可用的。下面是一个很简单的例子,例子很简单,页面上动态添加10个textbox,在viewstate里面保存一个标志位,表示是否动态添加了这些控件,在LoadViewState函数里进行判断,如果有这个标志,则重新加载这些控件。
 

None.gif public   bool  IsDynamicLoadControl
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif        
get
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
object dynamic = ViewState["IsDynamicLoadControl"];
InBlock.gif            
return dynamic == null ? false : true;
ExpandedSubBlockEnd.gif        }

InBlock.gif        
set
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            ViewState[
"IsDynamicLoadControl"= value;
ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif    }

None.gif    
protected   override   void  LoadViewState( object  savedState)
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif        
base.LoadViewState(savedState);
InBlock.gif
InBlock.gif        
if (IsDynamicLoadControl)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            LoadTextBox();
ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif    }

None.gif
None.gif    
protected   void  Page_Load( object  sender, EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif        
if (!IsPostBack)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            LoadTextBox();
ExpandedSubBlockEnd.gif        }

InBlock.gif        
ExpandedBlockEnd.gif    }

None.gif    
private   void  LoadTextBox()
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif        
for (int i = 0; i < 10; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            TextBox input 
= new TextBox();
InBlock.gif            input.ID 
= "input" + i.ToString();
InBlock.gif            
this.form1.Controls.Add(input);
ExpandedSubBlockEnd.gif        }

InBlock.gif        IsDynamicLoadControl 
= true;
ExpandedBlockEnd.gif    }

最后可以进行测试一下:
None.gif TextBox tb  =   this .FindControl( " input0 " as  TextBox;
None.gif        ClientScript.RegisterStartupScript(
None.gif            
this .GetType(), 
None.gif            
""
None.gif            
string .Format( " <script>alert('{0}')</script> " ,tb.Text));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值