比如,我有4个按钮,A、B、C、D,另外有一个控件,类似活页夹,对应也有A、B、C、D四个栏目。我需要当我点击其中一个按钮的时候会弹出一个页面,我在新页面选定一定内容后新页面关闭,并将活页控件定位到相应栏目。
现在我的问题是这样的,当我第一次点击ABCD任意一个按钮并在弹出页面里选定一定内容后活页控件可以成功定位到相应栏目,而第二次点按钮并选定内容后活页控件就不会动了,刷新页面也没有用,等我第三次点按钮(还不需要选定内容)后活页控件又会定位到第二次点的按钮相应的页面去。
有大虾知道怎么回事的请帮忙解决。
谢谢了!
13 个解决方案
#1
代码的问题。
#2
可能是哪里出了问题啊?
先谢过!
#3
点击之后,要立刻刷新/界面上的控件,而不是仅仅留下一个状态标记。你的“活页”控件显然没有考虑好活动的时序。
#4
你考虑一下逻辑,点A按钮时,abcd活页的位置怎么处理,点其他的又怎么处理,可能逻辑不对,再不行就贴一下代码
#5
哈哈,自己解决了,这个分分就给我自己了。
我在父页面里加了句
RegisterStartupScript(null, "<script>document.forms(0).submit();</script>");
就可以了,不过还是有点不理想,因为在子页面选中后回到父页面会连续刷新两次。
谁能告诉我怎么解决这个问题的话分分还是照样送出,谢谢了!
我在父页面里加了句
RegisterStartupScript(null, "<script>document.forms(0).submit();</script>");
就可以了,不过还是有点不理想,因为在子页面选中后回到父页面会连续刷新两次。
谁能告诉我怎么解决这个问题的话分分还是照样送出,谢谢了!
#6
在我过去写过的控件中,通常至少会这样写:
int stateNum{ //设置活页夹激活序号
set{
ViewState["state"]=value;
this.ChildControlsCreated=false; //this.或者this.自控件.
}
get{
.....
int stateNum{ //设置活页夹激活序号
set{
ViewState["state"]=value;
this.ChildControlsCreated=false; //this.或者this.自控件.
}
get{
.....
#7
或者,至少你应该意识到,当你重新设置了活页夹序号之后,至少对活页夹有类似 Controls.Clear() 这样的事情发生,也就是必须将控件清空,然后重建。如果你不重建,直接输出了(只有再次回发才重建),就太随意了。
#8
sp1234,非常感谢你的热心帮忙。
我的问题似乎没有这么复杂。。。。
我其实就是需要在子页面改变父页面那个活页控件的栏目参数(就是选择相应的abcd),然后将父页面提交一次,父页面的活页控件就能正确显示我要的栏目了。
但是我在子页面里没法改变父页面里这个自定义的活页控件栏目参数(这个问题我前两天在这里提过,没能解决,好像sp1234大哥你也参与讨论了的。)
所以我就想办法通过子页面选中后触发父页面里某个事件,在那个事件函数里改变活页控件栏目参数,这样的结果就是顺序不对了:
子页面改变父页面的一个TextBox的内容-->子页面提交父页面-->父页面触发TextBox.TextChanged事件-->活页控件栏目参数被调整(最后父页面没有被重新提交)。
所以才会造成活页控件没有按要求跳转栏目吧?
我又在TextBox.TextChanged事件函数面里将父页面提交了一次,就达到目的了。就是刷新两次烦的很。。。。。
大虾们有办法可以不用刷新两次吗?
拜谢!
我的问题似乎没有这么复杂。。。。
我其实就是需要在子页面改变父页面那个活页控件的栏目参数(就是选择相应的abcd),然后将父页面提交一次,父页面的活页控件就能正确显示我要的栏目了。
但是我在子页面里没法改变父页面里这个自定义的活页控件栏目参数(这个问题我前两天在这里提过,没能解决,好像sp1234大哥你也参与讨论了的。)
所以我就想办法通过子页面选中后触发父页面里某个事件,在那个事件函数里改变活页控件栏目参数,这样的结果就是顺序不对了:
子页面改变父页面的一个TextBox的内容-->子页面提交父页面-->父页面触发TextBox.TextChanged事件-->活页控件栏目参数被调整(最后父页面没有被重新提交)。
所以才会造成活页控件没有按要求跳转栏目吧?
我又在TextBox.TextChanged事件函数面里将父页面提交了一次,就达到目的了。就是刷新两次烦的很。。。。。
大虾们有办法可以不用刷新两次吗?
拜谢!
#9
我没有你那个帖子的印象。
子页面改变父页面的一个TextBox的内容-->子页面提交父页面-->父页面触发TextBox.TextChanged事件-->活页控件栏目参数被调整-->活页控件被删除了-->活页控件重新建立/装入/绑定
这才是完整的程序流程。
子页面改变父页面的一个TextBox的内容-->子页面提交父页面-->父页面触发TextBox.TextChanged事件-->活页控件栏目参数被调整-->活页控件被删除了-->活页控件重新建立/装入/绑定
这才是完整的程序流程。
#10
我不知道你的活页控件是什么控件,我上面举的代码其实很简单,你会看到只要修改参数就自动删除自己内部的控件,这样在PreRender过程中页面会自动调用EnsureChildControls,这个方法就会自动调用CreateChildControls方法重新建立控件内容。
而我的控件的动态创建控件内容的过程都是在复合控件标准的CreateChildControls方法中创建从来不在page_load中创建。因为一般人都是从入门书上学的那种最简单并且从不全面交互功能的例子,所以我举例也往往假设一般人的动态装载控件的代码是在page_load而不是CreateChildControls中,但是我并不在page_load中装载任何动态控件。
可能你还是觉得我说的有点复杂。其实就是一句话,你不知道怎样在事件中删除子控件,并且将重建子控件推迟到PreRender阶段的方法,因此在重新设置了活页夹参数之后没有刷新控件。
不过你没有详述你的活页夹控件,更没有提供它接受参数和创建内容的代码,我只是猜测。
而我的控件的动态创建控件内容的过程都是在复合控件标准的CreateChildControls方法中创建从来不在page_load中创建。因为一般人都是从入门书上学的那种最简单并且从不全面交互功能的例子,所以我举例也往往假设一般人的动态装载控件的代码是在page_load而不是CreateChildControls中,但是我并不在page_load中装载任何动态控件。
可能你还是觉得我说的有点复杂。其实就是一句话,你不知道怎样在事件中删除子控件,并且将重建子控件推迟到PreRender阶段的方法,因此在重新设置了活页夹参数之后没有刷新控件。
不过你没有详述你的活页夹控件,更没有提供它接受参数和创建内容的代码,我只是猜测。
#11
我给你说一下CreateChildControls的概念:
this.ChildControlsCreated=false 是删除子控件并且作标记说明子控件还没有产生。当this.EnsureChildControls的时候,一旦看到这个标记为false,就会调用CreateChildControls方法。而页面page类型对象会在RenderControl之前首先递归对所有子控件都调用PreRender,而每一个控件的PreRender方法默认会调用this.EnsureChildControls,也就是确保控件已经被产生。
当自定义控件有一些业务属性的时候,每一个属性的set方法之后,你可能都相当应该立刻刷新控件,因为参数改变了!但是这是不现实的。实际做法是如上仅仅设置 this.ChildControlsCreated=false,避免每一个属性被改变都额外重新创建一遍子控件。
另外,实际上也不需要在page_load中动态装载控件。因为页面回发会在Init事件之后立刻递归调用所有子控件的EnsureChidControls方法,这样动态装载控件会自动在Init事件之后并且已经能够获得ViewState值之后立刻被执行。
this.ChildControlsCreated=false 是删除子控件并且作标记说明子控件还没有产生。当this.EnsureChildControls的时候,一旦看到这个标记为false,就会调用CreateChildControls方法。而页面page类型对象会在RenderControl之前首先递归对所有子控件都调用PreRender,而每一个控件的PreRender方法默认会调用this.EnsureChildControls,也就是确保控件已经被产生。
当自定义控件有一些业务属性的时候,每一个属性的set方法之后,你可能都相当应该立刻刷新控件,因为参数改变了!但是这是不现实的。实际做法是如上仅仅设置 this.ChildControlsCreated=false,避免每一个属性被改变都额外重新创建一遍子控件。
另外,实际上也不需要在page_load中动态装载控件。因为页面回发会在Init事件之后立刻递归调用所有子控件的EnsureChidControls方法,这样动态装载控件会自动在Init事件之后并且已经能够获得ViewState值之后立刻被执行。
#12
你可能都相当应该立刻刷新控件 --> 你可能都想到应该立刻刷新控件
#13
大哥你这个实在太复杂,有点看不懂。
不过不管怎么样,感谢你的热心帮忙,散分^_^
不过不管怎么样,感谢你的热心帮忙,散分^_^
#1
代码的问题。
#2
可能是哪里出了问题啊?
先谢过!
#3
点击之后,要立刻刷新/界面上的控件,而不是仅仅留下一个状态标记。你的“活页”控件显然没有考虑好活动的时序。
#4
你考虑一下逻辑,点A按钮时,abcd活页的位置怎么处理,点其他的又怎么处理,可能逻辑不对,再不行就贴一下代码
#5
哈哈,自己解决了,这个分分就给我自己了。
我在父页面里加了句
RegisterStartupScript(null, "<script>document.forms(0).submit();</script>");
就可以了,不过还是有点不理想,因为在子页面选中后回到父页面会连续刷新两次。
谁能告诉我怎么解决这个问题的话分分还是照样送出,谢谢了!
我在父页面里加了句
RegisterStartupScript(null, "<script>document.forms(0).submit();</script>");
就可以了,不过还是有点不理想,因为在子页面选中后回到父页面会连续刷新两次。
谁能告诉我怎么解决这个问题的话分分还是照样送出,谢谢了!
#6
在我过去写过的控件中,通常至少会这样写:
int stateNum{ //设置活页夹激活序号
set{
ViewState["state"]=value;
this.ChildControlsCreated=false; //this.或者this.自控件.
}
get{
.....
int stateNum{ //设置活页夹激活序号
set{
ViewState["state"]=value;
this.ChildControlsCreated=false; //this.或者this.自控件.
}
get{
.....
#7
或者,至少你应该意识到,当你重新设置了活页夹序号之后,至少对活页夹有类似 Controls.Clear() 这样的事情发生,也就是必须将控件清空,然后重建。如果你不重建,直接输出了(只有再次回发才重建),就太随意了。
#8
sp1234,非常感谢你的热心帮忙。
我的问题似乎没有这么复杂。。。。
我其实就是需要在子页面改变父页面那个活页控件的栏目参数(就是选择相应的abcd),然后将父页面提交一次,父页面的活页控件就能正确显示我要的栏目了。
但是我在子页面里没法改变父页面里这个自定义的活页控件栏目参数(这个问题我前两天在这里提过,没能解决,好像sp1234大哥你也参与讨论了的。)
所以我就想办法通过子页面选中后触发父页面里某个事件,在那个事件函数里改变活页控件栏目参数,这样的结果就是顺序不对了:
子页面改变父页面的一个TextBox的内容-->子页面提交父页面-->父页面触发TextBox.TextChanged事件-->活页控件栏目参数被调整(最后父页面没有被重新提交)。
所以才会造成活页控件没有按要求跳转栏目吧?
我又在TextBox.TextChanged事件函数面里将父页面提交了一次,就达到目的了。就是刷新两次烦的很。。。。。
大虾们有办法可以不用刷新两次吗?
拜谢!
我的问题似乎没有这么复杂。。。。
我其实就是需要在子页面改变父页面那个活页控件的栏目参数(就是选择相应的abcd),然后将父页面提交一次,父页面的活页控件就能正确显示我要的栏目了。
但是我在子页面里没法改变父页面里这个自定义的活页控件栏目参数(这个问题我前两天在这里提过,没能解决,好像sp1234大哥你也参与讨论了的。)
所以我就想办法通过子页面选中后触发父页面里某个事件,在那个事件函数里改变活页控件栏目参数,这样的结果就是顺序不对了:
子页面改变父页面的一个TextBox的内容-->子页面提交父页面-->父页面触发TextBox.TextChanged事件-->活页控件栏目参数被调整(最后父页面没有被重新提交)。
所以才会造成活页控件没有按要求跳转栏目吧?
我又在TextBox.TextChanged事件函数面里将父页面提交了一次,就达到目的了。就是刷新两次烦的很。。。。。
大虾们有办法可以不用刷新两次吗?
拜谢!
#9
我没有你那个帖子的印象。
子页面改变父页面的一个TextBox的内容-->子页面提交父页面-->父页面触发TextBox.TextChanged事件-->活页控件栏目参数被调整-->活页控件被删除了-->活页控件重新建立/装入/绑定
这才是完整的程序流程。
子页面改变父页面的一个TextBox的内容-->子页面提交父页面-->父页面触发TextBox.TextChanged事件-->活页控件栏目参数被调整-->活页控件被删除了-->活页控件重新建立/装入/绑定
这才是完整的程序流程。
#10
我不知道你的活页控件是什么控件,我上面举的代码其实很简单,你会看到只要修改参数就自动删除自己内部的控件,这样在PreRender过程中页面会自动调用EnsureChildControls,这个方法就会自动调用CreateChildControls方法重新建立控件内容。
而我的控件的动态创建控件内容的过程都是在复合控件标准的CreateChildControls方法中创建从来不在page_load中创建。因为一般人都是从入门书上学的那种最简单并且从不全面交互功能的例子,所以我举例也往往假设一般人的动态装载控件的代码是在page_load而不是CreateChildControls中,但是我并不在page_load中装载任何动态控件。
可能你还是觉得我说的有点复杂。其实就是一句话,你不知道怎样在事件中删除子控件,并且将重建子控件推迟到PreRender阶段的方法,因此在重新设置了活页夹参数之后没有刷新控件。
不过你没有详述你的活页夹控件,更没有提供它接受参数和创建内容的代码,我只是猜测。
而我的控件的动态创建控件内容的过程都是在复合控件标准的CreateChildControls方法中创建从来不在page_load中创建。因为一般人都是从入门书上学的那种最简单并且从不全面交互功能的例子,所以我举例也往往假设一般人的动态装载控件的代码是在page_load而不是CreateChildControls中,但是我并不在page_load中装载任何动态控件。
可能你还是觉得我说的有点复杂。其实就是一句话,你不知道怎样在事件中删除子控件,并且将重建子控件推迟到PreRender阶段的方法,因此在重新设置了活页夹参数之后没有刷新控件。
不过你没有详述你的活页夹控件,更没有提供它接受参数和创建内容的代码,我只是猜测。
#11
我给你说一下CreateChildControls的概念:
this.ChildControlsCreated=false 是删除子控件并且作标记说明子控件还没有产生。当this.EnsureChildControls的时候,一旦看到这个标记为false,就会调用CreateChildControls方法。而页面page类型对象会在RenderControl之前首先递归对所有子控件都调用PreRender,而每一个控件的PreRender方法默认会调用this.EnsureChildControls,也就是确保控件已经被产生。
当自定义控件有一些业务属性的时候,每一个属性的set方法之后,你可能都相当应该立刻刷新控件,因为参数改变了!但是这是不现实的。实际做法是如上仅仅设置 this.ChildControlsCreated=false,避免每一个属性被改变都额外重新创建一遍子控件。
另外,实际上也不需要在page_load中动态装载控件。因为页面回发会在Init事件之后立刻递归调用所有子控件的EnsureChidControls方法,这样动态装载控件会自动在Init事件之后并且已经能够获得ViewState值之后立刻被执行。
this.ChildControlsCreated=false 是删除子控件并且作标记说明子控件还没有产生。当this.EnsureChildControls的时候,一旦看到这个标记为false,就会调用CreateChildControls方法。而页面page类型对象会在RenderControl之前首先递归对所有子控件都调用PreRender,而每一个控件的PreRender方法默认会调用this.EnsureChildControls,也就是确保控件已经被产生。
当自定义控件有一些业务属性的时候,每一个属性的set方法之后,你可能都相当应该立刻刷新控件,因为参数改变了!但是这是不现实的。实际做法是如上仅仅设置 this.ChildControlsCreated=false,避免每一个属性被改变都额外重新创建一遍子控件。
另外,实际上也不需要在page_load中动态装载控件。因为页面回发会在Init事件之后立刻递归调用所有子控件的EnsureChidControls方法,这样动态装载控件会自动在Init事件之后并且已经能够获得ViewState值之后立刻被执行。
#12
你可能都相当应该立刻刷新控件 --> 你可能都想到应该立刻刷新控件
#13
大哥你这个实在太复杂,有点看不懂。
不过不管怎么样,感谢你的热心帮忙,散分^_^
不过不管怎么样,感谢你的热心帮忙,散分^_^