当前位置:编程学习 > C#/ASP.NET >>

重写一个类似dropdownlist的控件

我自己写一个类似dropdownlist的控件,但是不是下拉框,数据存储类似
dropdownlist是名值对的,即:(text,value)
我现在需要的是(text,value,object),存3个值

后台实现是简单的,继承一下CollectionBase,写个add属性就好。。。。Items就会有数据。。。
但是这个控件如何实现在前台赋值
比如dropdownlist可以在前台这样赋值
	<asp:dropdownlist id="Ddl_Kind" runat="server">
<asp:ListItem Value="">———请选择———</asp:ListItem>
<asp:ListItem Value="101">这个是在UI添加下拉框元素</asp:ListItem>
         <asp:ListItem Value="102">我要的是在UI添加我新写的控件的元素</asp:ListItem>
</asp:dropdownlist>
--------------------编程问答-------------------- 定义一个类用声明数据项
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace CustomComponents
{
    public class ListItem
    {
        private string _text;
        private string _value;
        private string _object;

        [Category("Behavior")]
        [DefaultValue("")]
        [Description("项文本")]
        [NotifyParentProperty(true)]
        public string Text
        {
            get { return _text; }
            set { _text = value; }
        }

        [Category("Behavior")]
        [DefaultValue("")]
        [Description("项值")]
        [NotifyParentProperty(true)]
        public string Value
        {
            get { return _value; }
            set { _value = value; }
        }

        [Category("Behavior")]
        [DefaultValue("")]
        [Description("项对象")]
        [NotifyParentProperty(true)]
        public string Ojbect
        {
            get { return _object; }
            set { _object = value; }
        }
    }
}

定义一个集合项类
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace CustomComponents
{
    public class Items:List<ListItem>
    {
        public Items()
            : base()
        {
        }

    }
}

定义控件
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace CustomComponents
{
    [ToolboxData("<{0}:DropDownList runat=server></{0}:DropDownList>")]
    [PersistChildren(false)]
    [ParseChildren(true,"Items")]
    public class DropDownList : WebControl
    {
        private Items items;

        [PersistenceMode(PersistenceMode.InnerDefaultProperty)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        [TypeConverter(typeof(CollectionConverter))]
        [Category("杂项")]
        public Items Items
        {
            get
            {
                if (this.items == null)
                    items = new Items();
                return items;
            }

        }

        protected override HtmlTextWriterTag TagKey
        {
            get
            {
                return HtmlTextWriterTag.Select;
            }
        }

        protected override void RenderContents(HtmlTextWriter writer)
        {
            if (items == null)
                items = new Items();
            foreach (ListItem item in items)
            {
                if (items.Count > 0)
                {
                    writer.AddAttribute(HtmlTextWriterAttribute.Value, item.Value);
                    writer.RenderBeginTag(HtmlTextWriterTag.Option);
                    writer.Write(item.Text);
                    writer.RenderEndTag();
                }
            }
        }
    }
}
--------------------编程问答-------------------- LZ的方法是一种,不过下面的方法也可以实现啊,而且比较简单。

1. 在页面上加一个服务器端的HTML下拉列表控件
<select runat="server" id="slt">
   <option>aaa</option>
</select>

2. 后台为下拉列表绑值,对于VALUE和TEXT以外的绑定值,可以通过方法addAttribute方法增加一个属性来实现。
就像下面的HTML代码:
<select runat="server" id="slt">
   <option value="aaa" value1="bbb">aaa</option>
</select>
其中value1就是新添加的属性 --------------------编程问答-------------------- 属于自定义控件。 你把赋值的属性写在里面 就好了。 --------------------编程问答--------------------
引用 2 楼 conanhhy 的回复:
LZ的方法是一种,不过下面的方法也可以实现啊,而且比较简单。

1. 在页面上加一个服务器端的HTML下拉列表控件
<select runat="server" id="slt">
  <option>aaa</option>
</select>

2. 后台为下拉列表绑值,对于VALUE和TEXT以外的绑定值,可以通过方法addAttribute方法增加一个属性来实现。
就像下面……

我们是一个国际化的大公司,不能用你所说的方法,而且这个控件将会在多个项目中反复利用。
总监让我写底层控件,必须自己写,我想简单一点就用c#写,实在不行就用c++写 --------------------编程问答-------------------- 在web里面怎么会有什么“底层控件”?

怎么写都是生产HTML,交给浏览器解析。要不就是js、ajax控制dom。

你说的底层控件是什么意思呢?

c# c++都是工作在服务器端的,难道你想写OCX控件?

=========
private string _value;
private string _object;

既然 value 和object 都是string,那么请问他们有什么区别呢?为什么不能用一个值?


--------------------编程问答--------------------
引用 5 楼 jyk 的回复:
在web里面怎么会有什么“底层控件”?

怎么写都是生产HTML,交给浏览器解析。要不就是js、ajax控制dom。

你说的底层控件是什么意思呢?

c# c++都是工作在服务器端的,难道你想写OCX控件?

=========
private string _value;
private string _object;

既然 value 和object 都是strin……

不是html控件,是asp.net控件,com组件,或者说是一个类,也是一个对象
就好像dropdownlist是html控件么?是asp.net的一个对象,是一种数据类型,即使不在页面上show,后台就可以把他当成名值对数组使用 --------------------编程问答-------------------- 自己顶一下~~~ --------------------编程问答--------------------  这个问题太高深了
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,