关于WebControl事件的问题,参与者有分

时间:2021-04-03 08:17:57
这个问题有点奇怪,应该是我对web的机制不太了解,请高手们解释一下,先谢谢了
我在页面上添加了两个控件 Button1 和 DropDownList1
.aspx

<body MS_POSITIONING="GridLayout">
<form id="TestForm" method="post" runat="server">
<asp:DropDownList id="DropDownList1" style="Z-INDEX: 101; LEFT: 152px; POSITION: absolute; TOP: 160px"
runat="server" Width="200px" Height="104px" AutoPostBack="True">
<asp:ListItem Value="aaa1">aaa1</asp:ListItem>
<asp:ListItem Value="bbb2">bbb2</asp:ListItem>
<asp:ListItem Value="ccc">ccc3</asp:ListItem>
</asp:DropDownList>
<asp:Button id="Button1" style="Z-INDEX: 102; LEFT: 168px; POSITION: absolute; TOP: 248px" runat="server"
Width="104px" Height="24px" Text="Button"></asp:Button></form>
</body>

.cs
private void DropDownList1_SelectedIndexChanged(object sender, System.EventArgs e)
{
   this.Response.Write("<script>alert('"+this.DropDownList1.SelectedValue+"');</script>");
}

private void Button1_Click(object sender, System.EventArgs e)
{
this.DropDownList1.SelectedIndex=1;
}


问题1:当我把DropDownList1.AutoPostBack="false" 的时候,改变DropDownList1 不触发他的SelectedIndexChanged事件,这个没问题;我点button的时候,SelectedIndex 改变了,触发了SelectedIndexChanged事件,不过alert出来的值却是旧的值,并不是当前我选择的值--不理解微软这样处理的道理是什么?

问题2:当我把 DropDownList1.AutoPostBack="true" 的时候,改变DropDownList1 触发了他的SelectedIndexChanged事件,alert处理的值是当前选择的值,这个也没问题;但我点击Button1的时候,确触发不了SelectedIndexChanged事件,当客户端的DropDownList1的值是正确的。--这个是什么道理呢?


----------问题比较长,大家可以把上面的代码拷贝过去试一下,谢谢了

19 个解决方案

#1


DropDownList1.AutoPostBack="true" 
那问题就在于这个咯。。。

不懂。。。学习加关注。。在群上看到的。。呵呵

#2


先来回答你为什么两次值不一样的问题:
AutoPostBack="false":比如DropDownList1现在的值为aaa1,你点击DropDownList1使其值为bbb2,页面没有发回,页面ViewState里DropDownList1状态的还是原来的值aaa1,并不是页面上显示的bbb2,但你点击Button的时候页面发回,DropDownList1的值由ViewState里DropDownList1状态来初始化。

AutoPostBack="true":比如DropDownList1现在的值为aaa1,你点击DropDownList1使其值为bbb2,页面发回,页面ViewState里DropDownList1状态的也就更改为值bbb2。

#3


哈哈,以上的分析如果有什么不对的地方,大家提出来。

#4


>>>问题1:

DropDownList是通过它的IPostBackDataHandler(即数据是否改变了)来决定是否触发他的SelectedIndexChanged事件的,AutoPostBack="true"只是决定是否马上postback而已

>>>不过alert出来的值却是旧的值

你是怎么绑定DropDownList的?试着在

if (!Page.IsPostBack)
{
  //在这里绑定
}

>>>问题2

上面说了,如果DropDownList在postback前后的选择没变,SelectedIndexChanged事件是不会触发的

#5


mapserver(杨东) 朋友:
现在我想知道的不是两种情况下值不一样的问题。
第一种情况下,我觉得可以理解也不可以理解。我alert出来的值是在Button_Click事件中改变了 DropDownList1 的SelectedIndex的值,触发了DropDownList1_SelectedIndexChanged 事件,既然是SelectedIndexChanged事件,为什么我这个时候取到的值不对呢?难道在服务器端改了值不算数,他只认ViewState返回回来的值?

第二种情况下,为什么我Button Click的时候,改变了 DropDownList1 的SelectedIndex的值却不触发 SelectedIndexChanged事件 事件了呢?

#6


系统是看postback前设置的SelectedIndex,与postback后通过获取浏览器返回的DropDownList的值决定的SelectedIndex,是否相同,如果不同,就会通过RaisePostDataChangedEvent() 来触发SelectedIndexChanged事件

改变SelectedIndex并不能触发SelectedIndexChanged事件,除非你自己调RaisePostDataChangedEvent()

#7


saucer(思归) ( )老大:

数据是我在 .aspx 里写的死的测试的,
事件是在
private void InitializeComponent()
{    
this.DropDownList1.SelectedIndexChanged += new System.EventHandler(this.DropDownList1_SelectedIndexChanged);
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Load += new System.EventHandler(this.Page_Load);
}

问题是 我在 AutoPostBack="false"的时候 Button点击事件里改变selectedIndex值能触发 SelectedIndexChanged事件,在AutoPostBack="true"的时候却触发不了这个事件了

#8


To:saucer(思归)老大就是老大。

接着说:

第二种,比如DropDownList1原来的是aaa1,点击选择bbb2。
按照老大的说法:DropDownList是通过它的IPostBackDataHandler(即数据是否改变了)来决定是否触发他的SelectedIndexChanged事件的,AutoPostBack="true"马上就发回到服务端,ViewState里DropDownList1的状态也就改变为bbb2,你再点Button它会去比较现在DropDownList1的值为bbb2,ViewState里DropDownList1的状态也是bbb2,它就认为数据没有改变,所以不会去执行DropDownList1_SelectedIndexChanged

#9


Page_Load 事件里我什么都没有放

#10


form:saucer(思归)
DropDownList是通过它的IPostBackDataHandler(即数据是否改变了)来决定是否触发他的SelectedIndexChanged事件的,AutoPostBack="true"只是决定是否马上postback而已

睡不着无聊,帮你一下。。
我全贴了,自己去试,我试过可以,你要是不行,就是人品问题。。哈哈。。
        private string [] bb=new string [5];
private void Page_Load(object sender, System.EventArgs e)
{
//  在此处放置用户代码以初始化页面  
if(!Page.IsPostBack)
{
bb[0]="bb";
bb[1]="cc";
bb[2]="aa";
bb[3]="cd";
bb[4]="cb";
for( int i=0;i<bb.Length;i++)
{
this.DropDownList1.Items.Add(bb[i]);
}
}
}

private void Button1_Click(object sender, System.EventArgs e)
{
                  //       this.Label1.Text=this.DropDownList1.SelectedValue.ToString();
this.DropDownList1.SelectedIndex=1;
}

private void DropDownList1_SelectedIndexChanged(object sender, System.EventArgs e)
{
this.Response.Write("<script>alert('"+this.DropDownList1.SelectedValue+"');</script>");
}



问题2

上面说了,如果DropDownList在postback前后的选择没变,SelectedIndexChanged事件是不会触发的

#11


思归说的很好

#12


学习~

#13


>>>问题1:

你理解错了,假如AutoPostBack="false",你改变了DropDownList1的选择,点button的时候,SelectedIndexChanged事件也被触发了

private void Button1_Click(object sender, System.EventArgs e)
{
this.DropDownList1.SelectedIndex=1;
}

然后你又把它的选择改为第二个选择

试着重新开始,把你的选择改为第三个,然后点button, 跳出的框里应该是你点button的选择的值(ccc)

#14


谢谢思归老大。

我本来想知道的是,我如何在服务端触发类似于SelectedIndexChanged事件,看来不能直接触发,得另外考虑了。

#15


哈哈,不错,可能是真的理解错了,我上面的理解也有错误,学了不少。

#16


you can trigger it, try

private void Button1_Click(object sender, System.EventArgs e)
{
this.DropDownList1.SelectedIndex=1;
((IPostBackDataHandler)DropDownList1).RaisePostDataChangedEvent();
}

#17


谢谢老大,我现在做的项目里,所有的控件都是动态产生的,所有的事件都是动态绑定上去的,服务器的事件触发可能还有点麻烦,我会尽量试你的方法

#18


as you may know, you can always call the event handler directly

private void Button1_Click(object sender, System.EventArgs e)
{
this.DropDownList1.SelectedIndex=1;
DropDownList1_SelectedIndexChanged(this.DropDownList1,e);
}

#19


as you may know, you can always call the event handler directly

private void Button1_Click(object sender, System.EventArgs e)
{
this.DropDownList1.SelectedIndex=1;
DropDownList1_SelectedIndexChanged(this.DropDownList1,e);
}

-------------------------主要是,在做的一个工具,实现的功能是用户可以任意定制界面和界面上的事件,也就是一个界面上什么都没有所有的控件和动作都是动态产生和控制的,C/S里已经实现了,现在要在B/S上也实现,由于C/S机制B/S机制不太一样,很多在C/S里容易实现功能,在B/S里不太好实现。

#1


DropDownList1.AutoPostBack="true" 
那问题就在于这个咯。。。

不懂。。。学习加关注。。在群上看到的。。呵呵

#2


先来回答你为什么两次值不一样的问题:
AutoPostBack="false":比如DropDownList1现在的值为aaa1,你点击DropDownList1使其值为bbb2,页面没有发回,页面ViewState里DropDownList1状态的还是原来的值aaa1,并不是页面上显示的bbb2,但你点击Button的时候页面发回,DropDownList1的值由ViewState里DropDownList1状态来初始化。

AutoPostBack="true":比如DropDownList1现在的值为aaa1,你点击DropDownList1使其值为bbb2,页面发回,页面ViewState里DropDownList1状态的也就更改为值bbb2。

#3


哈哈,以上的分析如果有什么不对的地方,大家提出来。

#4


>>>问题1:

DropDownList是通过它的IPostBackDataHandler(即数据是否改变了)来决定是否触发他的SelectedIndexChanged事件的,AutoPostBack="true"只是决定是否马上postback而已

>>>不过alert出来的值却是旧的值

你是怎么绑定DropDownList的?试着在

if (!Page.IsPostBack)
{
  //在这里绑定
}

>>>问题2

上面说了,如果DropDownList在postback前后的选择没变,SelectedIndexChanged事件是不会触发的

#5


mapserver(杨东) 朋友:
现在我想知道的不是两种情况下值不一样的问题。
第一种情况下,我觉得可以理解也不可以理解。我alert出来的值是在Button_Click事件中改变了 DropDownList1 的SelectedIndex的值,触发了DropDownList1_SelectedIndexChanged 事件,既然是SelectedIndexChanged事件,为什么我这个时候取到的值不对呢?难道在服务器端改了值不算数,他只认ViewState返回回来的值?

第二种情况下,为什么我Button Click的时候,改变了 DropDownList1 的SelectedIndex的值却不触发 SelectedIndexChanged事件 事件了呢?

#6


系统是看postback前设置的SelectedIndex,与postback后通过获取浏览器返回的DropDownList的值决定的SelectedIndex,是否相同,如果不同,就会通过RaisePostDataChangedEvent() 来触发SelectedIndexChanged事件

改变SelectedIndex并不能触发SelectedIndexChanged事件,除非你自己调RaisePostDataChangedEvent()

#7


saucer(思归) ( )老大:

数据是我在 .aspx 里写的死的测试的,
事件是在
private void InitializeComponent()
{    
this.DropDownList1.SelectedIndexChanged += new System.EventHandler(this.DropDownList1_SelectedIndexChanged);
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Load += new System.EventHandler(this.Page_Load);
}

问题是 我在 AutoPostBack="false"的时候 Button点击事件里改变selectedIndex值能触发 SelectedIndexChanged事件,在AutoPostBack="true"的时候却触发不了这个事件了

#8


To:saucer(思归)老大就是老大。

接着说:

第二种,比如DropDownList1原来的是aaa1,点击选择bbb2。
按照老大的说法:DropDownList是通过它的IPostBackDataHandler(即数据是否改变了)来决定是否触发他的SelectedIndexChanged事件的,AutoPostBack="true"马上就发回到服务端,ViewState里DropDownList1的状态也就改变为bbb2,你再点Button它会去比较现在DropDownList1的值为bbb2,ViewState里DropDownList1的状态也是bbb2,它就认为数据没有改变,所以不会去执行DropDownList1_SelectedIndexChanged

#9


Page_Load 事件里我什么都没有放

#10


form:saucer(思归)
DropDownList是通过它的IPostBackDataHandler(即数据是否改变了)来决定是否触发他的SelectedIndexChanged事件的,AutoPostBack="true"只是决定是否马上postback而已

睡不着无聊,帮你一下。。
我全贴了,自己去试,我试过可以,你要是不行,就是人品问题。。哈哈。。
        private string [] bb=new string [5];
private void Page_Load(object sender, System.EventArgs e)
{
//  在此处放置用户代码以初始化页面  
if(!Page.IsPostBack)
{
bb[0]="bb";
bb[1]="cc";
bb[2]="aa";
bb[3]="cd";
bb[4]="cb";
for( int i=0;i<bb.Length;i++)
{
this.DropDownList1.Items.Add(bb[i]);
}
}
}

private void Button1_Click(object sender, System.EventArgs e)
{
                  //       this.Label1.Text=this.DropDownList1.SelectedValue.ToString();
this.DropDownList1.SelectedIndex=1;
}

private void DropDownList1_SelectedIndexChanged(object sender, System.EventArgs e)
{
this.Response.Write("<script>alert('"+this.DropDownList1.SelectedValue+"');</script>");
}



问题2

上面说了,如果DropDownList在postback前后的选择没变,SelectedIndexChanged事件是不会触发的

#11


思归说的很好

#12


学习~

#13


>>>问题1:

你理解错了,假如AutoPostBack="false",你改变了DropDownList1的选择,点button的时候,SelectedIndexChanged事件也被触发了

private void Button1_Click(object sender, System.EventArgs e)
{
this.DropDownList1.SelectedIndex=1;
}

然后你又把它的选择改为第二个选择

试着重新开始,把你的选择改为第三个,然后点button, 跳出的框里应该是你点button的选择的值(ccc)

#14


谢谢思归老大。

我本来想知道的是,我如何在服务端触发类似于SelectedIndexChanged事件,看来不能直接触发,得另外考虑了。

#15


哈哈,不错,可能是真的理解错了,我上面的理解也有错误,学了不少。

#16


you can trigger it, try

private void Button1_Click(object sender, System.EventArgs e)
{
this.DropDownList1.SelectedIndex=1;
((IPostBackDataHandler)DropDownList1).RaisePostDataChangedEvent();
}

#17


谢谢老大,我现在做的项目里,所有的控件都是动态产生的,所有的事件都是动态绑定上去的,服务器的事件触发可能还有点麻烦,我会尽量试你的方法

#18


as you may know, you can always call the event handler directly

private void Button1_Click(object sender, System.EventArgs e)
{
this.DropDownList1.SelectedIndex=1;
DropDownList1_SelectedIndexChanged(this.DropDownList1,e);
}

#19


as you may know, you can always call the event handler directly

private void Button1_Click(object sender, System.EventArgs e)
{
this.DropDownList1.SelectedIndex=1;
DropDownList1_SelectedIndexChanged(this.DropDownList1,e);
}

-------------------------主要是,在做的一个工具,实现的功能是用户可以任意定制界面和界面上的事件,也就是一个界面上什么都没有所有的控件和动作都是动态产生和控制的,C/S里已经实现了,现在要在B/S上也实现,由于C/S机制B/S机制不太一样,很多在C/S里容易实现功能,在B/S里不太好实现。

#20