C#自定义用户控件之下拉框

WebForm中,若一个asp页面中需要有很多个DropDownList控件的话,在后台即需写很多的绑定数据源方法,代码量较多且不易维护;然后咱自己就写了个用户自定义的控件,便于重用;但所牺牲的即是程序上的效率;话不多说,直接上代码:

控件源代码:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WUCDropDownList.ascx.cs" Inherits="DWTWPS.CommonHelper.UserControls.WUCDropDownList" %>
<asp:DropDownList ID="ddlTarget" runat="server" OnSelectedIndexChanged="DoSelectedIndexChanged"></asp:DropDownList>

控件后台.cs代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace DWTWPS.CommonHelper.UserControls
{
    public partial class WUCDropDownList : System.Web.UI.UserControl
    {
        private Repeater _rp;

        [Browsable(true)]
        public string TextField
        {
            get { return this.ddlTarget.DataTextField; }
            set { this.ddlTarget.DataTextField = value; }
        }

        [Browsable(true)]
        public string ValueField
        {
            get { return this.ddlTarget.DataValueField; }
            set { this.ddlTarget.DataValueField = value; }
        }

        [Browsable(true)]
        public string SelectedValue
        {
            get { return this.ddlTarget.SelectedValue; }
            set { this.ddlTarget.SelectedValue = value; }
        }

        [Browsable(true)]
        public string SelectedText
        {
            get { return this.ddlTarget.SelectedItem.ToString(); }
        }

        [Browsable(true)]
        public int SelectedIndex
        {
            get { return this.ddlTarget.SelectedIndex; }
            set { this.ddlTarget.SelectedIndex = value; }
        }

        [Browsable(true)]
        public string CssClass
        {
            get { return this.ddlTarget.CssClass; }
            set { this.ddlTarget.CssClass = value; }
        }
        
        [Browsable(true)]
        public bool AutoPostBack
        {
            get { return this.ddlTarget.AutoPostBack; }
            set { this.ddlTarget.AutoPostBack = value; }
        }

        [Browsable(true)]
        [DefaultValue(true)]
        public bool Enabled
        {
            get { return ddlTarget.Enabled; }
            set { ddlTarget.Enabled = value; }
        }

        [Browsable(true)]
        [DefaultValue(true)]
        public DataTable DataSource
        {
            get { return ddlTarget.DataSource as DataTable; }
            set { ddlTarget.DataSource = value; }
        }

        private string _dataAssembly = "Wps.BLL";

        //程序集名:默认Wps.BLL
        [Browsable(true)]
        public string DataAssembly
        {
            get { return _dataAssembly; }
            set { _dataAssembly = value; }
        }

        //类名
        [Browsable(true)]
        public string DataAssemblyInstance
        {
            get;
            set;
        }
        
        //方法名
        [Browsable(true)]
        public string FunctionName
        {
            get;
            set;
        }

        //可执行语句
        [Browsable(true)]
        public string SqlToFunc
        {
            get;
            set;
        }

        //筛选参数的集合
        public Dictionary<string, string> ParameterDic
        {
            get; 
            set;
        }

        private bool _isFirstViewData = true;
        //第一次是否数据可见
        [Browsable(true)]
        public bool IsFirstViewData
        {
            get { return _isFirstViewData; }
            set { _isFirstViewData = value; }
        }

        private string _firstValueValue = "0";

        [Description("下拉数据的第一个值")]
        [Browsable(true)]
        [DefaultValue("0")]
        public string FirstVauleValue
        {
            get { return _firstValueValue; }
            set { _firstValueValue = value; }
        }

        private string _firstTextValue = "-请选择-";
        //下拉数据的一个文本值
        public string FirstTextValue
        {
            get { return _firstTextValue; }
            set { _firstTextValue = value; }
        }

        public WUCDropDownList()
        {
            BaseSelectedIndexChangedCancel = false;
        }

        public bool BaseSelectedIndexChangedCancel { get; set; }

        [Browsable(true)]
        public event EventHandler SelectedIndexChanged;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                DataBind();
            }
        }

        protected void Page_Init(object sender, EventArgs e)
        {
            Control c = Parent;
            _rp = c.FindControl("Repeater") as Repeater;

            while (c != null && _rp == null)
            {
                _rp = c.FindControl("Repeater") as Repeater;
                c = c.Parent;
            }
        }

        public override void DataBind()
        {
            //第一次数据不可见
            if (!IsFirstViewData)
            {
                Clear();
                return;
            }

            DataTable tbl = new DataTable();
            object obj = null;

            if (!string.IsNullOrEmpty(_dataAssembly) && !string.IsNullOrEmpty(DataAssemblyInstance))
            {
                var instance = Assembly.Load(_dataAssembly).CreateInstance(_dataAssembly + "." + DataAssemblyInstance);
                if (instance != null)
                {
                    Type function = instance.GetType();

                    if (ParameterDic != null && ParameterDic.Count > 0)
                    {
                        obj = function.InvokeMember(FunctionName, BindingFlags.InvokeMethod, null, instance,
                            new object[] {ParameterDic, TextField + "," + ValueField});
                    }
                    else
                        obj = function.InvokeMember(FunctionName, BindingFlags.InvokeMethod, null, instance,
                            new object[] {SqlToFunc});
                }
            }
            else
            {
                obj = DataSource;
            }

            if (obj is DataTable)
            {
                tbl = (DataTable)obj;
                if (tbl != null && tbl.Rows.Count > 0)
                {
                    DataRow dr = tbl.NewRow();
                    dr[ValueField] = _firstValueValue;
                    dr[TextField] = _firstTextValue;
                    tbl.Rows.InsertAt(dr, 0);

                    ddlTarget.DataSource = tbl;
                    ddlTarget.DataBind();
                }
                else
                {
                    ddlTarget.Items.Clear();
                    ddlTarget.DataSource = tbl;
                    ddlTarget.DataBind();
                }
            }
        }

        public void Clear()
        {
            ddlTarget.Items.Clear();
            ddlTarget.Items.Insert(0, new ListItem(_firstTextValue, _firstValueValue));
        }

        protected void DoSelectedIndexChanged(object sender, EventArgs e)
        {
            if (SelectedIndexChanged != null)
            {
                SelectedIndexChanged(sender, e);
            }
        }
    }
}

到此,我们即完成了自定义控件的开发,下面我们来看看怎么使用的;
html中控件的引入:

<%@ Register Src="~/CommonHelper/UserControls/WUCDropDownList.ascx" TagPrefix="uc1" TagName="WUCDropDownList" %>

<div class="region fl border_style clear region_03"> <div class="border_left fl"></div> <div class="border_mid fl"> <uc1:WUCDropDownList runat="server" ID="ddlGuiGe" AutoPostBack="true" OnSelectedIndexChanged="ddlS_SelectedIndexChanged" IsFirstViewData="False" DataAssemblyInstance="Mat_GuiGeBLL" TextField="Mat_GuiGe_Title" ValueField="Mat_GuiGe_ID" FunctionName="GetMatGuiGe" SqlToFunc="SELECT Mat_GuiGe_Title,Mat_GuiGe_ID FROM Mat_GuiGe" FirstTextValue="-选择规格-" FirstVauleValue="0" CssClass="sWidth" /> </div> <div class="border_right fl"></div> </div>

到此,运行该页,其实已经可以将数据绑定出来了的;但很多时候,都会设计到下拉的多级联动,则此时,需要再页面的.cs代码中写上代码,进行更改二级下拉框的数据和绑定,代码如下:

protected void ddlKeMu2_SelectedIndexChanged(object sender, EventArgs e)
        {
            string selEd = ddlKeMu2.SelectedValue;

            if (selEd != "0")
            {
                Dic.Clear();
                Dic.Add("CLT_Id_Three", selEd);
                Dic.Add("Mat_GuiGe_JinCheng", "0");
                ddlGuiGe.ParameterDic = Dic;
                ddlGuiGe.IsFirstViewData = true;
                ddlGuiGe.DataBind();
            }
            else
                ddlGuiGe.Clear();
        }

调用了ddlGuiGe.DataBind()后,即刷新了下拉框中数据源。

 

转载于:https://www.cnblogs.com/liuqichun/p/4499649.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值