风影ASP.NET基础教学 8用户控件编程之自定义事件

既然用户控件可以有自己的方法和属性,同样也可以自己的事件。通过方法和属性,用户控件响应网页代码的变化。然而使用事件时,刚好与方法和属性相反,用户控件通知网页发生了某些活动,然后由网页代码做出响应

有时候,给用户控件添加一个事件可以解决大难题。例如,登陆用户控件,就可以给它添加一个自己的提交事件,这样提交的时候就可以方便的获取回传的值,如用户名和密码等信息(viewstate)。当然给用户控件添加事件也不是那么麻烦。一般情况下,可以在用户控件文件中定义一个事件,然后再宿主页面(aspx)中来订阅这个事件。当按钮被单击并提交资料时,产生事件,发布通知,这样宿主页面就可以受到信息并处理这个事件。

下面我们就来演示一下

用户控件页面代码

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="LoginControl.ascx.cs" Inherits="ASPNETTeach4.LoginControl" %>
用户名:<asp:TextBox ID="txtLoginName" runat="server"></asp:TextBox>
密码:<asp:TextBox ID="txtLoginPwd" runat="server" TextMode="Password"></asp:TextBox>
<asp:Button ID="btnLogin" runat="server" Text="Button" OnClick="btnLogin_Click" />

设计好页面后,接下来需要创建自定义对象LoginEventControlArgs类,并在该类中添加一个EventMessage属性。该属性是一个只读属性,用来返回相关的用户名和密码信息等。

事件参数代码

public class LoginEventControlArgs:EventArgs
{
    public string LoginName { get; set; }
    public string LoginPwd { get; set; }
 
    public string EventMessage {
        get {
            return DateTime.Now.ToString() +
                "账号:" + LoginName +
                "---密码:" + LoginPwd;
        }
    }
}

定义好自定义事件参数后,我们还需要事件签名的委托。可以将该委托加在任何你喜欢的地方,一般情况下放在同一个命名空间下。

    public delegate void LoginEventControlHandler(object sender,LoginEventControlArgs);

控件的后置代码

public partial class LoginControl : System.Web.UI.UserControl
{
    //定义事件
    public event LoginEventControlHandler LoginEvent;
    protected void Page_Load(object sender, EventArgs e)
    {
    }
 
    protected void btnLogin_Click(object sender, EventArgs e)
    {
        if (LoginEvent != null) {
            LoginEventControlArgs args = new LoginEventControlArgs();
            args.LoginName = txtLoginName.Text;
            args.LoginPwd = txtLoginPwd.Text;
            LoginEvent(this, args);
        }
    }
}

现在我们一个自定义事件的方法就完成了。下面我们来用页面使用一下

调用页面

<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
        <uc1:LoginControl runat="server" OnLoginEvent="LoginControl_LoginEvent" id="LoginControl" />
    </div>
    </form>
</body>

后置代码

protected void LoginControl_LoginEvent(object sender,LoginEventControlArgs args)
{
    if (args.LoginName == "admin" && args.LoginPwd == "123") {
        this.Label1.Text = "登陆成功";
    }
}

运行效果

image

 

以编程的方式动态加载用户控件

 

在实际开发中经常遇见这种情况,要求系统根据某种条件来动态加载相关的用户控件。

        protected void Page_Load(object sender, EventArgs e)
        {
            LoginControl c = Page.LoadControl("~/LoginControl.ascx") as LoginControl;
            PlaceHolder1.Controls.Add(c);
            c.LoginEvent += LoginControl_LoginEvent;
              
        }
 
    
        protected void LoginControl_LoginEvent(object sender,LoginEventControlArgs args)
        {
            if (args.LoginName == "admin" && args.LoginPwd == "123") {
                this.Label1.Text = "登陆成功";
            }
        }

我们看到和winform的动态添加控件的方式基本一致。

但是生成的源代码中我们发现控件ID和我们ASP上的ID不一致了。

image

我们有时候需要控制js如果生成这种ID的话JS编写导致一些错误。那么我们可以这么做

<script type="text/javascript">
    alert(<%= Label1.ClientID%>.innerHTML);
</script>

显示效果:

image

 

ClientIDMode属性

我们除了上面这种硬编码的方式,当然还有更优雅的方式。

ASPNET给我们提供了3个生成的ID的方式

Interit

默认情况下,页面上所有控件都使用值为Inherit的ClientIDMode,它表示控件将适用于其父控件相同的ClientIDMode,即这个值指定控件像它的父控件一样产生ID。

Static

使用控件原始的命名方式

AutoID

采用默认的3.5生成的方式

后面我们进入第二部分 ASP.NET数据访问

posted on 2012-08-26 22:09  任生风影  阅读(816)  评论(1编辑  收藏  举报

导航