Label控件既强大又好用。为了让它更强大、更好用,我们来写一个继承自Label的控件。
[×××]


扩展Label控件(1) - 实现回发(Postback)功能


作者:webabcd


介绍
扩展Label控件:
通过注册HiddenField控件,使Label控件支持回发(Postback)功能

使用方法(设置属性):
EnablePostback - 是否启用Label控件的回发(Postback)
HiddenFieldPostfix - 使Label支持回发(Postback)的隐藏控件的后缀名


关键代码
ScriptLibrary.js
//----------------------------
// http://webabcd.cnblogs.com/
//----------------------------

function yy_sl_copyTextToHiddenField(source, destination)
{
/// <summary>将Label控件的的值赋给隐藏控件</summary>

        document.getElementById(destination).value = document.getElementById(source).innerHTML;
}
 
SmartLabel.cs
using System;
using System.Collections.Generic;
using System.Text;

using System.Web.UI.WebControls;
using System.Web.UI;

[assembly: System.Web.UI.WebResource("YYControls.SmartLabel.Resources.ScriptLibrary.js", "text/javascript")]

namespace YYControls
{
        /// <summary>
        /// SmartLabel类,继承自DropDownList
        /// </summary>
        [ToolboxData(@"<{0}:SmartLabel runat='server'></{0}:SmartLabel>")]
        [System.Drawing.ToolboxBitmap(typeof(YYControls.Resources.Icon), "SmartLabel.bmp")]
        public partial class SmartLabel : Label
        {
                /// <summary>
                /// 构造函数
                /// </summary>
                public SmartLabel()
                {

                }

                /// <summary>
                /// OnPreRender
                /// </summary>
                /// <param name="e">e</param>
                protected override void OnPreRender(EventArgs e)
                {
                        base.OnPreRender(e);

                        // 实现Label控件的回发(Postback)功能
                        ImplementPostback();
                }
        }
}
 
Property.cs
using System;
using System.Collections.Generic;
using System.Text;

using System.ComponentModel;
using System.Web.UI;

namespace YYControls
{
        /// <summary>
        /// SmartLabel类的属性部分
        /// </summary>
        public partial class SmartLabel
        {
                /// <summary>
                /// 使Label支持回发(Postback)的隐藏控件的后缀名
                /// </summary>
                [
                Browsable(true),
                Description("使Label支持回发(Postback)的隐藏控件的后缀名"),
                Category("扩展"),
                DefaultValue("EnablePostback")
                ]
                public virtual string HiddenFieldPostfix
                {
                        get
                        {
                                string s = (string)ViewState["HiddenFieldPostfix"];

                                return (s == null) ? "EnablePostback" : s;
                        }
                        set
                        {
                                ViewState["HiddenFieldPostfix"] = value;
                        }
                }

                /// <summary>
                /// 是否启用Label控件的回发(Postback)
                /// </summary>
                [
                Browsable(true),
                Description("是否启用Label控件的回发(Postback)"),
                Category("扩展"),
                DefaultValue(false)
                ]
                public virtual bool EnablePostback
                {
                        get
                        {
                                bool? b = (bool?)ViewState["EnablePostback"];

                                return (b == null) ? false : (bool)b;
                        }

                        set
                        {
                                ViewState["EnablePostback"] = value;
                        }
                }
        }
}
 
EnablePostback.cs
using System;
using System.Collections.Generic;
using System.Text;

using System.Data;
using System.Web.UI.WebControls;
using System.Web.UI;
using System.Web;

namespace YYControls
{
        /// <summary>
        /// SmartLabel类的属性部分
        /// </summary>
        public partial class SmartLabel
        {
                /// <summary>
                /// 实现Label控件的回发(Postback)功能
                /// </summary>
                private void ImplementPostback()
                {
                        if (this.EnablePostback)
                        {
                                // 使Label支持回发(Postback)的隐藏控件的ID
                                string hiddenFieldId = string.Concat(this.ClientID, "_", HiddenFieldPostfix);

                                // 注册隐藏控件
                                Page.ClientScript.RegisterHiddenField(hiddenFieldId, "");

                                // 注册客户端脚本
                                this.Page.ClientScript.RegisterClientScriptResource(this.GetType(),
                                        "YYControls.SmartLabel.Resources.ScriptLibrary.js");

                                // 表单提交前将Label控件的的值赋给隐藏控件
                                this.Page.ClientScript.RegisterOnSubmitStatement(this.GetType(),
                                        string.Format("yy_sl_enablePostback_{0}",
                                                this.ClientID),
                                        string.Format("yy_sl_copyTextToHiddenField('{0}', '{1}')",
                                                this.ClientID,
                                                hiddenFieldId));
                        }
                }

                /// <summary>
                /// 获取或设置 YYControls.SmartLabel 控件的文本内容
                /// </summary>
                public override string Text
                {
                        get
                        {
                                try
                                {
                                        if (this.EnablePostback && !string.IsNullOrEmpty(HttpContext.Current.Request[string.Concat(this.ClientID, "_", HiddenFieldPostfix)]))
                                        {
                                                // 隐藏控件的值
                                                return HttpContext.Current.Request[string.Concat(this.ClientID, "_", HiddenFieldPostfix)];
                                        }
                                        else
                                        {
                                                return base.Text;
                                        }
                                }
                                catch
                                {
                                        return base.Text;
                                }
                        }
                        set
                        {
                                try
                                {
                                        if (this.EnablePostback && !string.IsNullOrEmpty(HttpContext.Current.Request[string.Concat(this.ClientID, "_", HiddenFieldPostfix)]))
                                        {
                                                // 隐藏控件的值
                                                base.Text = HttpContext.Current.Request[string.Concat(this.ClientID, "_", HiddenFieldPostfix)];
                                        }
                                        else
                                        {
                                                base.Text = value;
                                        }
                                }
                                catch
                                {
                                        base.Text = value;
                                }
                        }
                }
        }
}