您所在的位置: 程序员家园 -> 家园博客 ->
 
在哪里摔倒
就在哪里自己爬起来

用户登录

查  找

最新评论

最新留言

常用网站

网易邮箱 GMAIL  

百度搜索 MSDN

霏凡软件 BT精品

影视帝国 射 手 网

电驴下载 全 库 网

友情连接

茄菲的窝 冰冰博客

枫叶飘零 玫  瑰

ACEN 云 豹 子

统  计



[cc]P55 4.3.2处理回传数据的实现
狼子 发表于 2007-6-3 23:47:00 阅读全文 | 回复(0) | 引用通告 | 编辑

要捕捉回传的事件,要继承IPostBackEventHandler接口,这个接口只有一个方法RaisePostBackEvent

要处理回传数据,就要继承IPostBackDataHandler接口,这个接口有两个方法LoadPostData和RaisePostDataChangedEvent,如果LoadPostData返回true,.net框架将自动调用RaisePostDataChangedEvent

P54

LoadPostData方法是用来检查摬给服务器的数据的,包含两个参数:

postDataKey,表示用于识别控件内数据的关键值,postData是提交数据的集合,其采用Key/Value结构,便于使用索引名称访问。要访问集合中的控件数据,只要采用如下代码即可:"string nData = postData[postDataKey];"。

下面是P55的例子,创建一个自定义文本框控件MyTextBox,其文本属性因回发而更改,因为文本框是不会自动触发服务器端事件的,所以在MyTextBox里定义了TextChanged事件,也不会自动触发,所以书上原来的例子使用了一个服务器端控件Button帮助触发

我修改了一下,加入了js事件,使MyTextBox失去焦点时就自动提交表单回传数据

MyTextBox.cs

using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Collections.Specialized;

namespace HyperTextControl
{
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:MyTextBox runat=server></{0}:MyTextBox>")]

    /*
     * 要处理回传的数据,就要继承IPostBackDataHandler接口
     * 这个接口有两个方法LoadPostData和RaisePostDataChangedEvent
     * 如果LoadPostData返回true,.net框架将自动调用RaisePostDataChangedEvent
     */
    public class MyTextBox : WebControl,IPostBackDataHandler
    {
        //定义TextChanged委托对象
        private static readonly object EventTextChanged = new object();
       
        //加入设计时的控件特性
        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("")]

        //视图状态管理
        public string Text
        {
            get
            {
                String s = (String)ViewState["Text"];
                return ((s == null) ? String.Empty : s);
            }

            set
            {
                ViewState["Text"] = value;
            }
        }

        //呈现控件
        protected override void Render(HtmlTextWriter writer)
        {
            //定义控件的属性
            writer.AddAttribute(HtmlTextWriterAttribute.Type, "text");
            writer.AddAttribute(HtmlTextWriterAttribute.Valign, this.Text);
            writer.AddAttribute(HtmlTextWriterAttribute.Name, this.UniqueID);
            //我加入这个属性,用于生成一个失去焦点就自动回传的js事件
            writer.AddAttribute("onblur", "document.forms[0].submit();");
            //呈现控件
            writer.RenderBeginTag(HtmlTextWriterTag.Input);
            writer.RenderEndTag();
        }

        #region IPostBackDataHandler 成员
        public bool LoadPostData(string postDataKey, NameValueCollection postCollection)
        {
            //添加 MyTextBox.LoadPostData实现
            string postedValue = postCollection[postDataKey];
            string presentValue = Text;
            if (presentValue == null || postedValue != presentValue)
            {
                Text = postedValue;
                return true;
            }
            return false;
        }
        public void RaisePostDataChangedEvent()
        {
            //添加MyTextBox.RaisePostDataChangedEvent实现
            OnTextChanged(EventArgs.Empty);
        }
        #endregion

        //定义事件属性结构
        public event EventHandler TextChanged
        {
            add
            {
                Events.AddHandler(EventTextChanged, value);
            }
            remove
            {
                Events.RemoveHandler(EventTextChanged, value);
            }
        }

        //定义OnTextChanged方法
        public void OnTextChanged(EventArgs e)
        {
            //先EventHandlerList中取回委托,将其转换成EventHandler类型,再使用
            EventHandler textchangedHandler = (EventHandler)Events[EventTextChanged];
            if (textchangedHandler != null)
            {
                textchangedHandler(this, e);
            }
        }
    }
}

调用控件测试的页面,P55_PostBackData.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="P55_PostBackData.aspx.cs" Inherits="P55_PostBackData" %>
<%@ Register Assembly="HyperTextControl" Namespace="HyperTextControl" TagPrefix="cc1" %>
<!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">
        在自定义文本框中输入数据,转移焦点后,数据会自动提交
        <cc1:mytextbox id="MyTextBox1" runat="server" ontextchanged="MyTextBox1_TextChanged"></cc1:mytextbox>
        <br />
        您输入的数据是:
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
    </form>
</body>
</html>

P55_PostBackData.aspx.cs

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class P55_PostBackData : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
       
    }
    protected void MyTextBox1_TextChanged(object sender, EventArgs e)
    {
        TextBox1.Text = MyTextBox1.Text;
    }
}

发表评论:

    昵称:
    密码:
    主页:
    标题:
Powered by Oblog.