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()后,即刷新了下拉框中数据源。

时间: 2024-10-10 13:45:32

C#自定义用户控件之下拉框的相关文章

(九)ASP.NET自定义用户控件(2)

http://www.cnblogs.com/SkySoot/archive/2012/09/04/2670678.html 用户控件 在 .NET 里,可以通过两种方式把自己的控件插入到 Web 窗体框架中: 用户控件:它是一小段页面,可以包括静态 HTML 代码和 Web 服务器控件.用户控件的好处是一旦创建了它,就可以在同一个 Web 应用程序的多个页面重用它.用户控件可以加入自己的属性,事件和方法. 自定义服务器控件:它是被编译的类,它通过编程生成自己的 HTML .服务器控件总是预编译

Android自定义用户控件简单范例(一)

一款优秀的移动应用需要具有自己独特统一的风格,通常情况下UI设计师会根据产品需求和使用人群的特点,设计整体的风格,界面的元素和控件的互效果.而原生态的Android控件为开发人员提供的是最基本的积木元素,如果要准确地传递统一的视觉效果和交互体验,对控件的自定义使用是非常有必要的. 这篇文章通过一个简单的从Java后台程序中进行创建的示例来说明Android自定义控件的运行原理. <LinearLayout xmlns:android="http://schemas.android.com/

Android自定义用户控件简单范例(二)

对于完全由后台定制的控件,并不是很方便其他人的使用,因为我们常常需要看到控件放到xml界面上的效果,并根据效果进行布局的调整,这就需要一个更加标准的控件制作流程: 我们的自定义控件和其他的控件一样,应该写成一个类,而这个类的属性是是有自己来决定的. 我们要在res/values目录下建立一个attrs.xml的文件,并在此文件中增加对控件的属性的定义. 使用AttributeSet来完成控件类的构造函数,并在构造函数中将自定义控件类中变量与attrs.xml中的属性连接起来. 在自定义控件类中使

Windows Phone 8.1中自定义用户控件及如何调用用户控件

对于有些强迫症的我,还是作为程序员,在自己编程的世界里,凡事都要按照自己的意愿来安排布局或者设计动画等 等.虽说微软已经给我们封装了太多太多的控件和模板,但是难免有时候不会符合我们的意愿和要求,在这个时候就 需要我们自己来设计用户自定义控件. 首先需要在VS中创建自定义控件,所以需要在项目名右击->添加->新建项->选择User Control(用户控件)->添加 结合之前一篇提及到的XAML语法和开头的定义的说明,这边借自定义用户控件和引用自定义控件进一步说明. 之前博客中见到X

Windows phone 在自定义用户控件(UserControl)——ColorPicker

编码前 学习Windows phone自定义用户控件,在<WPF编程宝典>学习的小例子.并根据windows phone稍微的不同,做了点修改.ColorPicker(颜色拾取器):拥有三个Slider代表颜色中的RGB的值,可以进行调节各自的值.还有一个显示颜色的区域,它的值可以设置,也可以随着三个Slider值得变化而变化.其中每个Slider值也要根据颜色区域而变化.还要提供一个能由外部看到的可注册事件. 依赖属性: 设置四个依赖属性:分别为ColorProperty,RedProper

在Winform界面使用自定义用户控件及TabelPanel和StackPanel布局控件

在很多时候,我们做一些非常规化的界面的时候,往往需要创建一些用户控件,在其中绘制好一些基础的界面块,作为后续重复使用的一个单元,用户控件同时也可以封装处理一些简单的逻辑.在开发Winform各种类型项目,我都时不时需要定制一些特殊的用户控件,以方便在界面模块中反复使用.我们一般是在自定义的用户控件里面,添加各种各样的界面控件元素,或者封装一些特殊的函数处理共外部调用等.本篇随笔主要介绍基于DevExpress的Winform开发经验,介绍一个类似看板信息的用户控件,并在TabelLayout和S

(八)ASP.NET自定义用户控件(1)

http://blog.csdn.net/laodao1/article/details/5897366 ASP.NET自定义控件组件开发 第一章:从一个简单的控件谈起 起始开发ASP.NET自定义控件不是那么的高深,当初我开始学的时候还有点恐惧,但是慢慢就好了.学习控件的开发技术,并不一定说以后要从事控件的开发,而是让我们深入的理解掌握ASP.NET内部的机理.你会发觉,当学习完控件开发技术后,你以后开发网站时有种得心应手的感觉.我不希望一上来就讲控件开始多么多么难啊,我会用一个演化的方法来讲

win10 uwp 验证输入 自定义用户控件

TextBox是给用户输入,我们有时要用户只输入数字,而用户输入汉字,我们就有提示用户,那么这东西用到次数很多,我们需要做成一个控件. 我们可以用别人的库,我找到一个大神写的库,很好用 我们使用这个库可以定义很多验证,我记录我如何使用他这个库,还有如何去修改这个库.如何自定义控件做一个和大神做的一样的控件. Nuget 我们用这个库是jamescroft写的,他上传到Nuget,我们可以去下载 用Nuget搜索WinUX.UWP.Xaml.Controls 下载完成就好 使用库 我们经常需要验证

自定义用户控件

一:项目中添加Web 用户控件后缀(.ascx) 注意后缀.ascx,它告诉网页这是一个用户控件.它没有什么特别含义,只是不让IIS去直接执行这段代码. 二:在页面上添加工具箱的自带控件(工具箱拖动控件到页面中) 三:在后台添加相应执行逻辑及操作 四:重新生成解决方案 五:页面开始使用 这段代码输出标准HTML页面,显示用户控件里的文字而不是标记.那么它是怎么实现的呢?关键就在注册(Register)说明.要注册控件,先要定义三个属性: TagPrefix:定义控件位置的命名空间.有了命名空间制