⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webtextpane.cs

📁 C#编写的在线用户统计、在线编辑器、验证码图片
💻 CS
字号:
/* 
 * WebTextPane.cs @Microsoft Visual Studio 2008 <.NET Framework 2.0 (or Higher)>
 * AfritXia
 * 2006-07-09
 * 
 * Copyright(c) http://www.AfritXia.NET/
 * 
 */

using System;
using System.Collections;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;

namespace Net.AfritXia.Web.UI
{
    /// <summary>
    /// 自定义 Web 编辑器
    /// </summary>
    [ParseChildren(false)]
    [ToolboxData(@"<{0}:WebTextPane Runat=""server""></{0}:WebTextPane>")]
    [ControlBuilder(typeof(WtpRootCtrlBuilder))]
    public class WebTextPane : WebControl, IPostBackDataHandler, INamingContainer, IClientRunTime
    {
        // 文本修改事件对象健
        private static readonly object Event_TextChanged = new object();

        // 工具条容器
        private WtpToolbarContainer m_toolbarContainer = null;
        // 设计器窗体
        private WtpDesignerPane m_designerPane = null;
        // 文本模型窗体
        private WtpTextModelPane m_textModelPane = null;
        // 存入 ViewState 的文本值
        private string m_viewStateTextValue = null;
        // 回发文本值
        private string m_postBackTextValue = null;
        // 当前文本值
        private string m_xmlNText = null;

        #region 类构造器
        /// <summary>
        /// 类默认构造器
        /// </summary>
        public WebTextPane()
            : base("div")
        {
        }

        /// <summary>
        /// 类参数构造器
        /// </summary>
        /// <param name="parentControl">父控件</param>
        public WebTextPane(TemplateControl parentControl)
            : this()
        {
            if (parentControl != null)
                parentControl.Controls.Add(this);
        }
        #endregion

        /// <summary>
        /// 文本修改事件处理句柄
        /// </summary>
        public event EventHandler TextChanged
        {
            add
            {
                this.Events.AddHandler(WebTextPane.Event_TextChanged, value);
            }

            remove
            {
                this.Events.RemoveHandler(WebTextPane.Event_TextChanged, value);
            }
        }

        /// <summary>
        /// 设置或获取当前文本值
        /// </summary>
        public string XMLNText
        {
            set
            {
                this.m_xmlNText = value;
            }

            get
            {
                return this.m_xmlNText;
            }
        }

        /// <summary>
        /// 获取设计器窗体控件
        /// </summary>
        public WtpDesignerPane DesignerPane
        {
            get
            {
                return this.m_designerPane;
            }
        }

        /// <summary>
        /// 获取工具条容器控件
        /// </summary>
        public WtpToolbarContainer ToolbarContainer
        {
            get
            {
                return this.m_toolbarContainer;
            }
        }

        /// <summary>
        /// 控件初始化函数
        /// </summary>
        /// <param name="e">初始化事件参数</param>
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);

            // <textarea></textarea>
            this.m_textModelPane = new Net.AfritXia.Web.UI.WtpTextModelPane();

            // 添加控件到集合
            this.Controls.Add(this.m_textModelPane);

            // 添加工具条
            if (this.m_toolbarContainer == null)
            {
                // 创建工具条容器控件
                this.m_toolbarContainer = new WtpToolbarContainer();
                this.m_toolbarContainer.AddToolbar(new WtpStandardToolbar("_default"));

                // 将工具条容器添加为子控件
                this.AddParsedSubObject(this.m_toolbarContainer);
            }

            // 添加设计器
            if (this.m_designerPane == null)
            {
                // 创建设计器控件
                this.m_designerPane = new WtpDesignerPane();

                // 将设计器添加为子控件
                this.AddParsedSubObject(this.m_designerPane);
            }
        }

        /// <summary>
        /// 控件加载函数
        /// </summary>
        /// <param name="e">加载事件参数</param>
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            if (this.Page.IsPostBack)
            {
                // 设置回发文本值
                this.XMLNText = this.m_postBackTextValue;
            }
        }

        /// <summary>
        /// 添加子标记
        /// </summary>
        /// <param name="obj"></param>
        protected override void AddParsedSubObject(object obj)
        {
            if ((obj is LiteralControl) == true)
            {
                string text = null;

                // 获取控件文本
                text = ((LiteralControl)obj).Text;
                text = text.Trim();

                if (String.IsNullOrEmpty(text.Trim()) == true)
                    return;
            }
            else if (obj is WtpToolbarContainer)
            {
                // 获取工具条容器控件
                this.m_toolbarContainer = (WtpToolbarContainer)obj;
                this.Controls.Add(this.m_toolbarContainer);

                return;
            }
            else if (obj is WtpDesignerPane)
            {
                // 获取设计器控件
                this.m_designerPane = (WtpDesignerPane)obj;
                this.Controls.Add(this.m_designerPane);

                // 获取文本值
                this.XMLNText = this.m_designerPane.InnerHtml;

                return;
            }

            throw new Exception("无效的子控件类型 ( Invalid Type of Child Control )");
        }

        /// <summary>
        /// 读取 ViewState 状态值
        /// </summary>
        /// <param name="savedState"></param>
        protected override void LoadViewState(object savedState)
        {
            object[] myObj = (object[])savedState;

            base.LoadViewState(myObj[0]);

            // 获取存放于 ViewState 中的文本值
            this.m_viewStateTextValue = (myObj[1] as string);
        }

        /// <summary>
        /// 保存 ViewState 状态值
        /// </summary>
        /// <returns></returns>
        protected override object SaveViewState()
        {
            object obj1 = base.SaveViewState();
            object obj2 = this.XMLNText;

            if (this.XMLNText == null)
                obj2 = "";

            return new object[] { obj1, obj2 };
        }

        /// <summary>
        /// 在绘制该控件之前,为控件注册为需要回发处理
        /// </summary>
        /// <param name="e"></param>
        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);

            // 为控件注册为需要回发处理
            this.Page.RegisterRequiresPostBack(this);

            // 注册客户端脚本
            (new WtpClientScriptManager(this.Page)).Register();

            // 如果样式为空,则使用默认样式
            if (String.IsNullOrEmpty(this.CssClass))
                this.CssClass = "WebTextPane";

            // 设置设计器的内置 HTML 为用户指定的文本
            this.m_designerPane.InnerHtml = this.XMLNText;
            // 设置隐藏字段文本
            this.m_textModelPane.InnerHtml = this.XMLNText;
        }

        /// <summary>
        /// 绘制该服务器控件
        /// </summary>
        /// <param name="writer"></param>
        protected override void Render(HtmlTextWriter writer)
        {
            base.Render(writer);

            // 绘制客户端脚本
            ClientRunTimeRender.Render(writer, this);
        }

        /// <summary>
        /// 引发 OnTextChanged 事件
        /// </summary>
        /// <param name="args">事件参数</param>
        protected virtual void OnTextChanged(EventArgs args)
        {
            EventHandler handler = Events[WebTextPane.Event_TextChanged] as EventHandler;

            if (handler != null)
                handler(this, EventArgs.Empty);
        }

        /// <summary>
        /// 将正则表达式匹配字符串转为大写
        /// </summary>
        /// <param name="match">正则表达式匹配结果</param>
        /// <returns>大写字符串</returns>
        public static string CapText(Match match)
        {
            return match.ToString().ToUpper();
        }

        #region IPostBackDataHandler 成员
        /// <summary>
        /// 读取回发数据
        /// </summary>
        /// <param name="postDataKey">回发数据健</param>
        /// <param name="postCollection">回发数据集合</param>
        /// <returns></returns>
        public bool LoadPostData(string postDataKey, NameValueCollection postCollection)
        {
            // 获取回发数据中的文本值
            this.m_postBackTextValue = postCollection[this.m_textModelPane.UniqueID];

            // 如果存放在 ViewState 中的文本值为空,则不触发 TextChanged 事件。 
            // 当该控件被嵌入到 web 用户控件(.ascx 控件)中时,ViewState 中的文本值有可能为空
            if (this.m_viewStateTextValue == null)
                return false;

            // 替换标记中的字符串为大写
            // 例如 <font size=2></font>,将替换成 <FONT SIZE=2></FONT>
            this.m_viewStateTextValue = Regex.Replace(this.m_viewStateTextValue,
                @"<[\/]{0,1}[^>]+>", new MatchEvaluator(CapText));

            // 如果文本已修改,则触发数据修改事件
            // RaisePostDataChangedEvent()
            return (this.m_postBackTextValue != this.m_viewStateTextValue);
        }

        /// <summary>
        /// 数据修改事件
        /// </summary>
        public void RaisePostDataChangedEvent()
        {
            this.OnTextChanged(EventArgs.Empty);
        }
        #endregion

        #region IClientRunTime 成员
        public string CreateJavaScriptObject()
        {
            return "new CWebTextPane();";
        }
        #endregion
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -