首页 新闻 赞助 找找看

用户控件事件触发问题(请求高手解惑)

0
悬赏园豆:100 [已关闭问题]

aspx页面源代码(Default.aspx and Default.aspx.cs

代码
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="UserControl._Default" %>
<%@ Register Src="~/WebUserControl1.ascx" TagPrefix="cc1" TagName="user" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<cc1:user runat="server"></cc1:user>
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
</div>
</form>
</body>
</html>
后台(Default.aspx.cs):
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

}

protected void Button1_Click(object sender, EventArgs e)
{
Page.ClientScript.RegisterStartupScript(
this.GetType(), "", "alert('22222');", true);
}
}

 

用户控件(WebUserControl1.ascx)源代码:

代码
<table cellspacing="0" rules="all" bordercolor="#CCCCCC" border="1" id="tbList" style="border-color: #CCCCCC;
width: 100%; border-collapse: collapse;" runat="server">
<tr class="DGHeaderStyle" id="trHeader">
</tr>
<tr id="trInput">

<td>
<asp:TextBox ID="TextBox1" runat="server" Width="150px" class="TextBoxStyle"
AutoPostBack
="true" OnTextChanged="txtInput_TextChanged" Style="color: #666"></asp:TextBox>
</td>
</tr>
<tr id="trTotal">
</tr>
</table>
用户控件后台(WebUserControl1.ascx.cs):
public partial class WebUserControl1 : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
HtmlTableRow row
= new HtmlTableRow();
HtmlTableCell cell
= new HtmlTableCell();
cell.InnerText
= "111";
row.Cells.Add(cell);
tbList.Rows.Insert(
1, row);
}


protected void txtInput_TextChanged(object sender, EventArgs e)
{
Page.ClientScript.RegisterStartupScript(
this.GetType(), "", "alert('11111');", true);
}
}

 

问题所在:触发了文本框的change事件后,在点击按钮结果文本框的changge事件与按钮的点击事件

同时触发(照理它应该只触发按钮事件)。

问题补充: 去掉动态添加Table行的代码事件执行正确!
Sun_Blue_Sky的主页 Sun_Blue_Sky | 初学一级 | 园豆:115
提问于:2010-07-23 11:08
< >
分享
其他回答(2)
0

是因为你在点击按钮的时候,焦点离开了文本框,由此出发了文本框的Change事件,一个办法就是,把文本框的Change事件尽量写到前台,这样在点按钮的时候,会先执行前台的代码。

dege301 | 园豆:2825 (老鸟四级) | 2010-07-23 12:54
change事件应该指的是现在的value与前面的value不相等才会触发,而不指的是焦点
支持(0) 反对(0) Sun_Blue_Sky | 园豆:115 (初学一级) | 2010-07-26 09:25
当同时有文本框的Change和按钮事件的时候,点按钮的时候,首先是焦点离开(假如value改变的话)导致回发服务器,就会先执行了文本框的Change,返回,按钮的事件被前台抛弃,如果没变化的话则不作任何反应,这是第一阶段;第二阶段,假如第一阶段没有回发,则执行按钮的点击操作
支持(0) 反对(0) dege301 | 园豆:2825 (老鸟四级) | 2010-07-26 12:36
那change事件为什么没被抛弃呢?照理来说changge事件已经执行过一次了,按照您的意思是 change事件应该已经抛弃了?不知道我的理解是否正确。
支持(0) 反对(0) Sun_Blue_Sky | 园豆:115 (初学一级) | 2010-07-26 13:47
还有为什么把动态加载插入树种一行的那段控件加载代码去掉为什么事件触发又正确了呢?
支持(0) 反对(0) Sun_Blue_Sky | 园豆:115 (初学一级) | 2010-07-26 13:48
@Sun_Blue_Sky:是我用词不当,不是抛弃,就是执行完change事件,页面的状态已经改变了,根本就没有接收到click事件
支持(0) 反对(0) dege301 | 园豆:2825 (老鸟四级) | 2010-07-26 20:18
可是button的click事件也执行了。
支持(0) 反对(0) Sun_Blue_Sky | 园豆:115 (初学一级) | 2010-07-26 22:21
@Sun_Blue_Sky:是不是根RegisterStartupScript有关,用RegisterClientScriptBlock呢?
支持(0) 反对(0) dege301 | 园豆:2825 (老鸟四级) | 2010-07-27 08:25
我建议您先运行下程序,如果不想ctrl+c那就给我个邮箱吧,我发代码给你。
支持(0) 反对(0) Sun_Blue_Sky | 园豆:115 (初学一级) | 2010-07-27 09:31
@Sun_Blue_Sky:无语了,要不就别用table了,换其他控件
支持(0) 反对(0) dege301 | 园豆:2825 (老鸟四级) | 2010-07-27 12:52
我也很无语。
支持(0) 反对(0) Sun_Blue_Sky | 园豆:115 (初学一级) | 2010-07-28 16:01
0

动态生成的Table行代码放到if(!IsPostBack)里。

Astar | 园豆:40805 (高人七级) | 2010-07-23 14:11
如果放到!IsPostBack中动态table就没法玩了,您可以测试下代码。
支持(0) 反对(0) Sun_Blue_Sky | 园豆:115 (初学一级) | 2010-07-26 09:26
0

你网页的默认焦点应该是按钮  而不是textbox

Longkin | 园豆:3 (初学一级) | 2010-07-23 16:14
同一楼,去掉动态是成的树中的行事件就不会乱触发您觉得还是这个问题么?
支持(0) 反对(0) Sun_Blue_Sky | 园豆:115 (初学一级) | 2010-07-26 09:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册