请教动态生成用户控件的问题
我使用vb.net,在一个button的click事件中动态生成几个用户控件实例,然后想在另一个button的click事件中读取这些实例的属性,不知如何引用这些实例,原来是用的方法是和生成时一样采用"实例名=page.loadcontrol("用户控件")",这样好象不行,感觉重新生成实例了,陷入无助状态,很无奈,而且很着急!!请高手们指教,万分感谢!!! 问题点数:40、回复次数:9Top
1 楼sqhua(拉长弓兮射天狼)回复于 2002-05-08 09:40:45 得分 0
没有用过VB.net,我用的是C#,但道理应该一样:
用动态方法生成的控件,在生成后(New)到加入页面(Add)的过程中,可以指定它的ID,这样,要引用这些控件时,只要FindControl(“ID")就可以了。Top
2 楼icyer()回复于 2002-05-08 09:43:58 得分 20
最好能放在Page_Load中。
如果放在其他事件里,当页面返回刷新的时候,控件就会消失。
Top
3 楼yunhi()回复于 2002-05-08 10:11:59 得分 20
除了Page_Load中,你还可以在页面初始化的时候动态生成控件(不过Page_Load我没试过),也就是在:
......
protected System.Web.UI.HtmlControls.HtmlTable table1;
......
override protected void OnInit(EventArgs e)
{
//
// 你要动态生成控件的代码
InitializeComponent();
base.OnInit(e);
}
例如在一个aspx文件中你有一个HTML server control “table1”:
<table id="table1" width="100%" border="1" runat="server">
</table>
你在系统初始化时加入如下代码:
override protected void OnInit(EventArgs e)
{
HtmlTableRow tr = new HtmlTableRow();
table1.Controls.Add(tr);
tr.BorderColor="Brown";
tr.ID="TR";
HtmlTableCell tc = new HtmlTableCell();
tr.Controls.Add(tc);
tc.VAlign="Center";
tc.Align="Center";
tc.InnerText="序号";
tc.ID="TC";
InitializeComponent();
base.OnInit(e);
}
那么你就可以通过server control的FindControl方法找到你要的控件例如:
HtmlTableCell MyControl=(HtmlTableCell)table1.Controls[1].FindControl("TC");
Top
4 楼piaoran81(飘然)回复于 2002-05-08 10:16:04 得分 0
还是不太明白,呵呵,因为使用findcontrol("id")后出现 “未将对象引用设置到对象的实例”的问题,也就是说,引用未成功,对吗?我想把代码给出来,请指正好吗?
<%@ Register TagPrefix="Upload" TagName="Question" Src="uploadQuestion.ascx" %>
<script runat="server" language="vb">
dim UploadQuestion as uploadQuestion_ascx
sub ModeOK_Click(obj as object,e as eventargs)
UploadQuestion=Page.LoadControl("uploadQuestion.ascx")
UploadQuestion.ID="UploadQuestions"
UploadQuestion.Question="hello"
pnlUpload.Controls.Add(UploadQuestion)//pnlUpload是一个模扳
end sub
sub UploadOK_Click(obj as object,e as eventargs)
dim question as string
UploadQuestion=page.FindControl("UploadQuestions")
question=UploadQuestion.Question//此句出现错误提示
response.write(question)
response.end
end sub
</script>
代码就是这样了,请指点!
另外,我需要的是点击后动态生成,所以,不能放在page_load中,控件消失后,是不是说,控件就不存在了,不能再被引用了?
Top
5 楼icyer()回复于 2002-05-08 10:21:29 得分 0
是的。ASP.NET把页面控件信息存放在ViewState里面,下次返回的时候就读取ViewState里面的数据,所以很多控件状态在页面返回刷新之后还存在。
而动态添加的控件并没有被放在ViewState里面,所以下次返回刷新的时候,就不会Load这些控件,当然也就不能访问了。
Top
6 楼yunhi()回复于 2002-05-08 11:01:06 得分 0
你将ModeOK_Click事件的代码放到
override protected void OnInit(EventArgs e)
{
//
// 你要动态生成控件的代码
InitializeComponent();
base.OnInit(e);
}
//试一试Top
7 楼piaoran81(飘然)回复于 2002-05-08 11:01:40 得分 0
关键是我必须选择好一些条件后才能生成控件,所以才采用动态生成的方法,像我代码写的那样,我把生成用户控件的代码放在了ModeOK_Click中,而引用是在UploadOK_Click中,就是说选择好了模式后,我才动态生成用户控件,然后想引用用户控件里边的属性Quetion(一个字符串类型),此时,点击UploadOK这个按钮,页面重新刷新了,所以,控件也就没了,这样的话,我的想法就无法实现了!不知有什么好的方法解决呢?!Top
8 楼icyer()回复于 2002-05-09 13:08:14 得分 0
在页面添加好控件,然后在代码里控制Visible属性。
Top
9 楼yunhi()回复于 2002-05-10 00:21:00 得分 0
你还可以选择好条件后,Redirect到另一页,通过取得上一页的Session或Request对象得到你选择的条件,然后在初始化页面的时候生成控件。Top




