重新加载的控件为何第一次初始化IsPostBack就为True?? 请各位帮忙~~~急

ue 2003-09-15 02:03:02
说明:我通过一个aspx动态加载一个ascx,一切正常
完成业务后,ascx中的事件让aspx动态加载另一个ascx


但是为何第二次加载的ascx的IsPostBack一上来就是true???


问题:
1,这是为什么?

2,这为何解决?

3,如果无法解决,那么我想知道有何方法判断第二次加载的控件是第一次加载?

谢谢~~~,请各位帮忙~~~
...全文
214 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
ue 2003-09-17
  • 打赏
  • 举报
回复
问题已经解决

方法如下:
当需要更新控件时我就让aspx重新加载,
这样就绕开了IsPostBack的问题
我也没有用VIEWSTATE

显然这并非我最初想的方式

我将所有控件的加载都放在了aspx的init中。

不知道各位认为我的方法如何?

感谢各位~~~
ue 2003-09-16
  • 打赏
  • 举报
回复
各位:能不能给我讲讲具体怎么用ViewState实现IsPostBack功能???
zhongkeruanjian(鸭子) :
千万不要把控件加载到INIT中,请看:http://expert.csdn.net/Expert/topic/2241/2241688.xml?temp=.152157
chnking(kent) 说的一段。

另外你说“ISPOSTBACK是PAGE的ISPOSTBACK”,好象不是吧,控件有自己的ispostback
它同页面不是一个值。

cnlamar(永恒瞬间.Net) :我不会用ViewState,
请把ViewState的主要过程写出来,拜托。


实际上我想作得是:
http://expert.csdn.net/Expert/topic/2241/2241688.xml?temp=.152157
http://expert.csdn.net/Expert/topic/2246/2246104.xml?temp=.4384577
chnking 2003-09-16
  • 打赏
  • 举报
回复
不要试图在click事件中加载用户控件,那将是很麻烦的事情。
最好是都在page_Init中加载,至于要加载什么用户控件,可以根据url的参数,或者数据库中的设置来预先得知,如果有些用户控件不是一开始就要加载而是要由某种事件来触发加载的(例如click事件),那可以把要加载的控件现在page_Init中加载,不过Visiable设为false,等事件出发后,将其显示出来。
zhongkeruanjian 2003-09-16
  • 打赏
  • 举报
回复
我来说两句:
1.死鬼说得不错,我没有搞盲目崇拜,呵呵,我查了.NET文档,USERCONTROL控件里没有单独的ISPOSTBACK,它的ISPOSTBACK是来自PAGE的,也就是说PAGE.ISPOSTBACK是在用户控件里面可见并有用的,
2.根据楼主的需求,我写了点代码,因为时间少,有很多方面没有考虑,因为这个用户控件(ASCX1)的NAMECONTRAINER是PANEL,并动态加载,第二个用户控件(ASCX2)在ASCX1的BUTTON事件中加载的,所以有一个问题,那就是页面级的回放怎么办?也就是每次页面级回放我必须触发ASCX1的BUTTON事件,不然我就加载不了ASCX2,那就更谈不上恢复状态了,呵呵,我想可以做个子定义控件,做为ASCX1的NAMECONTRAINER,呵呵,不过没想好,望大家试试
代码如下:
ASCX1:public class Liang : System.Web.UI.UserControl
{
protected System.Web.UI.WebControls.Label Label1;
protected System.Web.UI.WebControls.Button Button1;

private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
}

#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器
/// 修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion

private void Button1_Click(object sender, System.EventArgs e)
{
Sun sun = new Sun();
sun= (Sun) LoadControl("sun.ascx");
this.Controls.Add(sun);
}
}
ASCX2:
public class Sun : System.Web.UI.UserControl
{

private bool IsUserControlPostBack
{
get
{
object o = ViewState["IsUserControlPostBack"];
if (o == null)
{
return false;
}
return (bool) o;
}
set
{
ViewState["IsUserControlPostBack"] = value;
}
}

private void Page_Load(object sender, System.EventArgs e)
{
if(!IsUserControlPostBack)
Response.Write("处女,哈哈,我是通过第一次来的");
else
{
Response.Write("被处理过的女,我是通过第二次来的");
}
IsUserControlPostBack = true;

}
ASPX:
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Panel Panel1;

private void Page_Load(object sender, System.EventArgs e)
{

Liang liang = new Liang();
liang = (Liang) LoadControl("Liang.ascx");
Panel1.Controls.Add(liang);





}

chnking 2003-09-16
  • 打赏
  • 举报
回复
to ue(似敌是友):
“目前我在控件中的click事件中写入了加载程序。”

那一旦再次pastback后这个加载进来的用户控件就会没了
cnlamar 2003-09-16
  • 打赏
  • 举报
回复
对啊,视图多只有一个,他也应该只有一个,那就是在视图中增加一个键值,用来存放,对了,是这样的,呵呵,小弟初学,犯点毛病,望谅解~~
zhongkeruanjian 2003-09-16
  • 打赏
  • 举报
回复
看到楼上的,我又晕了,
那个ISPOSTBACK是PAGE的ISPOSTBACK,在PAGE下面的自控件里都是一致的,思归要你在用户控件里自己创造个保持VIEWSTATE属性值,也就是思归所说的FLAG了
zhongkeruanjian 2003-09-16
  • 打赏
  • 举报
回复
哈哈,千万不要把控件加载到INIT中,那时候控件属性状态还没有回到视图状态,你想得到的结果会与事实相反,呵呵,那时候你会郁闷到要死,所以动态加载时一定要在INIT之后,比如LOAD就可以
chnking 2003-09-16
  • 打赏
  • 举报
回复
我也觉得思归说的有点问题,不光PAGE有ISPOSTBACK属性,用户控件也有自己的ISPOSTBACK属性。
你说的问题我要测试一下
ue 2003-09-16
  • 打赏
  • 举报
回复
同志们~~~help!!
ue 2003-09-16
  • 打赏
  • 举报
回复
testing~~~~
ue 2003-09-16
  • 打赏
  • 举报
回复
chnking(kent) :
ViewState["step"]这个标志我能不能写在用户控件的基类中?
我想这样会方便些,但是不知道是否可行?
会不会两个控件会有冲突?
goody9807 2003-09-16
  • 打赏
  • 举报
回复
up
zhongkeruanjian 2003-09-16
  • 打赏
  • 举报
回复
给你一个思路,不过我自己没做,你试试吧,
你自己定义一个自定义控件,这个控件就是你所有的控件的包容器,然后在这个控件定义每个用户控件对应一个保持VIEWSTATE的是否判断它显示的标识值,在自定义控件创建控件的时候,自定义控件根据这些值来判断是否显示下属的每一个用户控件,并把此自定义的控件在ASPX中声明,以后,你可以根据页面传回来的值来确定自定义控件里的那些是否显示用户控件的标识值,并在自定义的控件的事件里,如果你需要加载另外一个自定义控件,那么你就把对应的那个在自定义控件里的标识值设置为TRUE,(这有点难度,不过可以实现),这样在你的自定义控件里就只管业务逻辑,不管是否显示其他用户控件的细节了。而一般的页面回放时自定义控件根据视图状态的值来判断是否显示用户控件了
不要在INIT里试图判断ISPOSTBACK的值,因为它是一个保持视图状态的值,(如果我没猜错的话)
它在INIT阶段还是默认值,还没有恢复视图状态,我建议你必须去看.NET的文档,看看它对INIT阶段到底做了些什么
zhongkeruanjian 2003-09-16
  • 打赏
  • 举报
回复
private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Load += new System.EventHandler(this.Page_Load);

}
这是C#中自动加的代码,目的是事件注册。不用去管他,
你的Me.IsPostBack是PAGE的ISPOSTBACK,不是你自定义控件的什么值,如果不相信,那你就在你的用户控件代码里写入IspostBack,然后点它,系统帮助会告诉你那是PAGE的ISPOSTBACK!!!
所以只要你第一次打开页面后,以后只要是回放,ISPOSTBACK都是TRUE
所以你要自定义一个判断它是否是回放的属性
chnking 2003-09-16
  • 打赏
  • 举报
回复
还有,楼主好像对ViewState比较陌生,我这简单的介绍一下:
ViewState你可以同Session类比,Session是对每个用户而言的,对同一个用户不同的页面Session值是不变的。ViewState是对同一个用户同一个页面而言的,就是说同一个用户在浏览一个aspx页面时,不管他postback来回多少趟,只要还是在这个页面,那么这个ViewState变量的值就是不变的:

给ViewState赋值:
ViewState["step"] = "first";
从ViewState取回值:
string str = ViewState["step"].ToString();
chnking 2003-09-16
  • 打赏
  • 举报
回复
思路有问题,千万不要在pastbackevent事件中加载用户控件,后果就是你现在的搞得这么麻烦。

提供个思路,你所有的一级用户控件(就是实现主要功能的模块)都是根据需要(根据url的参数,或者session)来加载,这部分应该可以在page_init中加载,因为page_init中可以获得要加载哪个控件的参数。
下面就是每个一级用户控件都可能是有几个二级控件组成,而这些二级用户控件又可能不是同时呈现出来,而是一步步的出现的,类似于不断的由“下一步”按钮串连起来的一系列步骤来逐个的显示,这时可以在一级用户控件中将所有要用到的二级控件按出现的顺序依次全部的放置到页面,然后将第一步要显示的控件的Visiable设为true,显示出来,别的控件隐藏。同时使用一个ViewState变量来表示当前处于哪一个步骤了:
ViewState["step"] = "first"; //不同的阶段有不同的标志来表示,“first”表示第一步
然后,根据这个ViewState["step"]来控制哪个控件显示,哪些隐藏。

这样处理不会出现控件没有加载,事件无法响应,还有一个你没有碰到的问题(还有loadpostbackdata的顺序问题)等等,等等一系列麻烦事。
ue 2003-09-16
  • 打赏
  • 举报
回复
help~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


ue 2003-09-16
  • 打赏
  • 举报
回复
快疯了~~~

好像各位的思路和我截然不同!!!
似乎我走错了方向。
下面再说明一下我得意图,
或许各位可以帮我指明更好的一个方向。请各位耐心啊~~~

背景:
我正在作一个web应用系统。它是一个mis。
界面框架是左列有树型菜单(下称菜单),右面是功能区域。
我认为如果去将每个功能都做成一个单独的aspx那就太麻烦了,
我想能不能只作一个核心的aspx(功能区域的aspx,下同),
所有功能都作成ascx,内涵业务逻辑,
作好了之后,aspx只需要根据传入的指令加载ascx其他的它不用过问。
这里传入的指令有两种:
一个是菜单提交的QueryString(在这里我不讨论它)
一个是业务设置的session
ascx实际上时加载到aspx中的panel


开发中我发现,
ascx控件的中的事件,只能在它第二次加载后执行。
就是说:ascx控件加载之后,你点击了它的按钮,
(例如按钮事件是完成添加数据)
这时aspx会再次加载,这是如果aspx不再加载此控件,
那么你点击的按钮事件就不会被触发。
那我怎么办啊~~~
最终我让ascx点击按钮后再次加载。
在执行按钮事件的尾部,我利用
Dim myControl1 = CType(LoadControl(Me.Context.Session.Item("ControlC")), System.Web.UI.UserControl)
Me.Parent.Controls.Add(myControl1)
加载新控件
利用
Me.Parent.Controls.Remove(Me)
将自身再从父控件中删除。

这样我就完成了一种交互。

如果按这种思路那么所有的控件都将被加载2次以上。
如果没有在第二次加载后执行事件,那么它还将被加载。


我利用一个
Session.Item("UpdateControlLock")
判断是否要继续更新控件。
如果不需要更新那么我还将加载原始的控件。

这样我就需要在控件初次加载的时候将
Session.Item("UpdateControlLock")设置成False

这样就在控件的Page_Init判断Me.IsPostBack来设置Session.Item("UpdateControlLock")

但是我发现了在事件中加载的第二个控件IsPostBack一上来就是true
这就让我无法为Session.Item("UpdateControlLock")设置成我的目标值。


~~~
~~~
~~~
~~~
看了
chnking(kent) :“那一旦再次pastback后这个加载进来的用户控件就会没了”

按我的想法是新控件初次加载时Session.Item("UpdateControlLock")设置成False
这样我就可以在aspx的init事件中根据Session.Item("UpdateControlLock")=False
再次加载当前控件Session.Item("ControlB"))

zhongkeruanjian(鸭子) :
能给解释一下:base.OnInit(e);
private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Load += new System.EventHandler(this.Page_Load);

}

~~~~~~~~~~~~
我说的差不多了,各位应该明白了吧?
各位是不是我想的有些问题,是不是还有其他方法可以实现?

请各位给我帮助~~~我很着急啊~~~


cnlamar 2003-09-15
  • 打赏
  • 举报
回复
思归的意思估计是说那几个["__VIEWSTATE"],Request.Form["__EVENTTARGET"]这些不是空的,那ISPOSTBACK就是打开的,所以呢,你只要在你的控件中把任何一个值处理为空,那不就是关闭的了?!
加载更多回复(7)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧