这个问题我已经提过两次了,可是始终没有解决,请各位高手帮帮忙。急啊!!!!

raulszh 2003-07-07 09:46:47
在我的程序中我通过一个Swich语句根据一个dropdownlist中所选择的项目,动态加载不同的用户控件,代码如下:
switch (SelectDrdownLst.SelectedItem.Value)
{
case "全部危险品企业浏览" :
HolderControl.Controls.Clear();
危险品企业信息浏览 ctlControl1 = (危险品企业信息浏览)LoadControl("危险品企业信息浏览.ascx");
HolderControl.Controls.Add(ctlControl1);
break;
case "具体危险品企业信息" :
HolderControl.Controls.Clear();
危险品企业信息查询 ctlControl2 = (危险品企业信息查询)LoadControl("危险品企业信息查询.ascx");
HolderControl.Controls.Add(ctlControl2);
break;
case "危险品企业人员信息" :
HolderControl.Controls.Clear();
危险品企业人员信息查询 ctlControl3 = (危险品企业人员信息查询)LoadControl("危险品企业人员信息查询.ascx");
HolderControl.Controls.Add(ctlControl3);
break;

当我运行程序时,如果我首先在SelectDrdownLst这个下拉列表框中选择任何一个选项,LoadControl()都会正常执行,可是当我改变SelectDrdownLst的SelectedItem时,LoadControl()就会发生执行错误。
例如:我首相在SelectedItem中选择“全部危险品企业浏览”,那么危险品企业信息浏览.ascx这个用户控件被正常加载,可是当我改变SelectedItem中的SelectedItem为”危险品企业人员信息“时,就会发身错误,“危险品企业人员信息查询.ascx”,无法被加载,并且提示错误是:
“System.InvalidCastException: 指定的转换无效
堆栈跟踪:
[InvalidCastException: 指定的转换无效。]
System.Web.UI.WebControls.WebControl.LoadViewState(Object savedState) +24
System.Web.UI.WebControls.Label.LoadViewState(Object savedState) +13
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +125
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +311
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +311
System.Web.UI.Control.AddedControl(Control control, Int32 index) +291
System.Web.UI.ControlCollection.Add(Control child) +153
ghxg.危险品企业作业人员培训查询.Page_Load(Object sender, EventArgs e) +590
System.Web.UI.Control.OnLoad(EventArgs e) +67
System.Web.UI.Control.LoadRecursive() +29
System.Web.UI.Control.LoadRecursive() +92
System.Web.UI.Control.LoadRecursive() +92
System.Web.UI.Control.LoadRecursive() +92
System.Web.UI.Page.ProcessRequestMain() +724

如果我首相在SelectedItem中选择“危险品企业人员信息”,那么“危险品企业人员信息查询.ascx”这个用户控件就会被正常加载,无任何错误。

当我把“危险品企业信息浏览.ascx”,“危险品企业信息查询.ascx”,“危险品企业人员信息查询.ascx”这三个用户控件的Document对象的EnableViewState属性改为false时就不会发生上述错误,可是,用户控件的一些函数却不会正常执行,例如用户控件中的DataGrid的编辑命令的响应函数,如果我点击DataGrid的第二页的第一行想要编辑他,但是页面刷新后,总是默认为第一页的第一行进行编辑。

不知道我说没说明白。
这个问题困扰了我很长时间了,请各位大侠帮帮忙。
...全文
26 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
chnking 2003-07-10
你的包含Switch语句的用户控件是直接放置在aspx页面,还是在代码中用Page.LoadControl加载的?
回复
raulszh 2003-07-09
我的SWITCH语句是在一个ASCX页面中,通过另外一个ASPX页面调用。如果改成楼上的那样,那么dorpdownlist的SelectedItem始终只是dorpdownlist中的第一个选项,所以PlaceHolder中不会加载任何用户控件。
回复
LongFire 2003-07-09
放到PreRender中试试
回复
raulszh 2003-07-09
楼上的,能在进一步交流一下马,我的Switch语句是放在Page_Load中的。
我按照你所说的测试了一下,我把Switch语句都屏蔽掉,在页面上加了个Label控件,Label控件的Text属性设置为dorpdownlist.SelectedItem.Text,运行后我发现dorpdownlist.SelectedItem.Text属性确实按照我的选择改变了,没有像你所说的一直不变。

期待你的进一步恢复。
回复
chnking 2003-07-09
我基本知道原因了:

按照msdn的描述,用户控件的载入顺序是这样的(只提到跟你问题有关的部分):
1,初始化(Init 事件(OnInit 方法))-- 初始化页面上放置的那些控件
2,加载视图状态(LoadViewState 方法)-- 恢复控件的状态
3,处理回发数据(LoadPostData 方法 )-- 处理客户端发回的PostBackData数据(比如TextBox.Text,DropDownList.SelectedItem等等),将发回的数据同原先的数据比较,若是有改变就做一个已改变标记,等Page_Load事件后,有需要的话出发控件值改变事件。然后将PostBackData数据设置到这个控件的值。
4,Page_Load事件 -- 执行所有请求共有的操作,如设置数据库查询。此时,树中的服务器控件已创建并初始化、状态已还原并且窗体控件反映了客户端的数据。
5,处理回发事件和各种用户触发事件 -- 这里来处理上面第三步控件值改变事件和各种用户触发事件,比如点击按钮事件等等。

对应到你的情况,你改变了dorpdownlist中的一个值,马上就提交到服务端,按理在服务端的第三步理回发数据(LoadPostData 方法 )时,已经将dorpdownlist的回发值给控件设置了值。可是问题是,在用户控件中这个顺序是有问题的,PostBackData的数据没有在第三步理回发数据(LoadPostData 方法 )时得到恢复,所以在Page_Load事件中能得到的永远是dorpdownlist设置的那个初始值。我测试过,直到“处理回发事件和各种用户触发事件”这一步时,dorpdownlist的回发值才被恢复到控件上。

你可以测试一下,在Page_Load事件设置一个断点,看dorpdownlist.SelectedItem,它永远是dorpdownlist设置的那个初始值。然后在Page_PreRender 事件中设一个断点,看dorpdownlist.SelectedItem,这时就会看到你选择的那个值。

在用户控件中会出现这个问题,但是如果在aspx文件中就不会出这个问题,aspx在Page_Load事件中dorpdownlist.SelectedItem已经得到恢复,这个我也测试过。

你的这个问题同我碰到的一个问题是一回事,请参看这个帖子:
http://expert.csdn.net/Expert/TopicView1.asp?id=1999950
回复
standy 2003-07-08
注意page_load里的載入內容
回复
Jeelen 2003-07-08
通常是控制PostBack时没有被加载的问题
回复
raulszh 2003-07-08
switch 在一个用户控件ascx中,switch语句是在PageLoad事件中,我的DropDownList的AutoPostBack属性设置为True。
回复
myhomeland 2003-07-08
可能是page_load的问题,因为你每选择一次 page_load 执行一次,你的dorpdownlist就会被初始化一次,你试试把你的switch语句放入一个子过程中,在page_load中作如下调用试试。

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'在此处放置初始化页的用户代码
If (Not IsPostBack) Then '如果是第一次执行form,则执行myswitch()
MySwitch() '调用你的swiitch语句
End If
End Sub
Private Sub MySwitch()
'放入你的选择过程
End Sub
回复
chnking 2003-07-07
我想问清楚一下,你的这个switch语句是在一个aspx文件中,还是也在一个用户控件ascx中?
另外这个switch语句是在PageLoad事件中还是在按钮点击事件或dropdownlist_SelectedIndexChanged事件中的?
回复
TLink 2003-07-07
试试
SelectDrdownLst.SelectedItem.Value 改为 SelectDrdownLst.SelectedItem.Text
回复
相关推荐
发帖
.NET技术社区
创建于2007-09-28

5.8w+

社区成员

.NET技术交流专区
申请成为版主
帖子事件
创建了帖子
2003-07-07 09:46
社区公告
暂无公告