当前位置:编程学习 > C#/ASP.NET >>

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

aspx页面源代码(Default.aspx) 
前台:
<%@ 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);
        }
    }

--------------------编程问答-------------------- 路过看看。。。什么问题啊? --------------------编程问答-------------------- 事件触发问题?你把代码copy运行下就知道了 --------------------编程问答-------------------- 如果能把项目丢进来,那就好了。你们直接运行就行了 --------------------编程问答-------------------- 路过,帮顶 --------------------编程问答-------------------- 最近玩动态table出现的问题,大家一起看看吧,搞不定哪天您也会遇上。 --------------------编程问答-------------------- 是呀!有什么问题呢?

界面编程本来就是讲究的是组件开发,每一个组件都是一个单独的小的应用程序,然后按照客户需要把这些界面组件拼凑在一起形成一个较大的业务处理桌面。只不过太多的做web网站简单界面的人也号称自己在做应用程序,使得web方面界面应用程序开发行业实在是太烂了(RIA的出现使得web应用程序有了新的起点)。

回到你的问题,如果你打算使用用户控件,比较好的思路就是预先设计好用户控件的接口——使用这个用户控件的其它程序可以通过数据属性、方法和事件随时读写数据并获得回调通知,而内部具体使用什么控件来实现用户交互操作则应该对外隐藏。因此用户控件内部实现上的事件,跟外部没有关系。假设用户控件在预先设计文档中说明了有某事需要及时通知调用者,它应该声明一个

    public event .....

来通知使用自己的组件,而不管它内部是TextBox还是HyperLink还是别的什么方法触发的这个通知事件。 --------------------编程问答--------------------
引用 5 楼 sun_blue_sky 的回复:
最近玩动态table出现的问题,大家一起看看吧,搞不定哪天您也会遇上。


你写 tbList.Rows.Insert(1, row); 之前是否认为随便改变控件树都可以?

我见过更有甚者(竟然在某还是主要的开发人员),花了1年时间搞个动不动就把一个控件Move到其它控件内部的所谓“架构”出来,最后这个公司其他程序员痛苦不堪。

以测试为准,如果测试出了bug,找自己原因,说明你设计之前需要深入系统架构去了解。 --------------------编程问答-------------------- 如果不能随便改变控件树,那操作Table的这些方法,您认为还有意义吗?
还有我想请问一下:为什么不能随意操作控件树呢?
其实前面的代码就是在加载的时候插入一行引起的问题,去掉就没事了,但我不知道具体原因..
还有我看了些书籍都没提到不能随便更改控件树,费解。 --------------------编程问答-------------------- 问题所在:触发了文本框的change事件后,在点击按钮结果文本框的changge事件与按钮的点击事件

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

--------------------编程问答-------------------- 学习了。 --------------------编程问答-------------------- 先吃饭,下午跑跑 看能不能帮你解决 --------------------编程问答-------------------- --------------------编程问答-------------------- 看了上面的觉得很迷茫 --------------------编程问答-------------------- 请求服务器刷新了页面,这个过程会触发TEXT的CHANGE事件 --------------------编程问答-------------------- --------------------编程问答-------------------- 事件触发过程:

直接点按钮:
Default page_load
uc page_load
Default Button1_Click

更改textbox值
Default page_load
uc page_load
uc txtInput_TextChanged

再点按钮
Default page_load
uc page_load
txtInput_TextChanged
Button1_Click

最后一步为什么会触发txtInput_TextChanged,那是因为textbox这时有值,而你uc又load了一遍,textbox初始化,值为空,因为viewstate,所以textbox的值为保留的值,所以会立刻触发txtInput_TextChanged --------------------编程问答-------------------- 仔细看了下楼上的回复,有些地方不太理解。
1、我在uc中只动态加载了一个table row 但是你说textbox重新被初始化了,可是我根本没动这个textbox,它怎么会被初始化(希望能详细讲解下)。
2、跟着你的推断,textbox被初始化了,值为空,那也就是我不管在页面做了怎样的操作值应该都是空的(因为你的意思是说textbox被重新加载了),也就是它最终显示的都是空值 。
--------------------编程问答-------------------- 路过  跟着学习下
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,