欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Asp.Net服务器控件开发的Grid实现(二)

程序员文章站 2022-04-30 13:18:47
我们先来实现grid类,代码如下: grid.cs using system; using system.collections.generic; using system.co...

我们先来实现grid类,代码如下:

grid.cs

using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.linq;
using system.text;
using system.threading.tasks;
using system.web.ui;

namespace aspnetservercontrol
{
    [designer("aspnetservercontrol.design.griddesigner, aspnetservercontrol.design")]//设计时支持,需要另外写一个对就的类
    [toolboxdata("")]
    [toolboxbitmap(typeof(grid), "toolbox.grid.bmp")]
    [description("表格控件")]
    [parsechildren(true)]
    [persistchildren(false)]
    [controlbuilder(typeof(notallowwhitespaceliteralsbuilder))]
    public class grid : controlbase
    {

        #region 属性

        #region datasource
        private object _datasource;
        public object datasource
        {
            get { return _datasource; }
            set { _datasource = value; }
        }
        #endregion

        #region columns
        private gridcolumncollection _columns;
        /// 
        /// 列数据
        /// 
        [category(categoryname.options)]
        [notifyparentproperty(true)]
        [persistencemode(persistencemode.innerproperty)]
        [editor(typeof(gridcolumnseditor), typeof(system.drawing.design.uitypeeditor))]//用于编辑器
        public virtual gridcolumncollection columns
        {
            get
            {
                if (_columns == null)
                {
                    _columns = new gridcolumncollection(this);

                }
                return _columns;
            }
        }
        #endregion

        #endregion


        protected override void render(htmltextwriter writer)
        {
            base.render(writer);
            if (_columns == null)
            {
                return;
            }
            writer.write("");
            renderheader(writer);
            renderbody(writer);
            writer.write("");
        }

        private void renderheader(htmltextwriter writer)
        {
            writer.write("");
            foreach (gridcolumn column in columns)
            {
                writer.write(string.format("{0}", column.headertext));
            }
            writer.write("");
        }

        private void renderbody(htmltextwriter writer)
        {
            datatable dt = datasource as datatable;
            if (dt == null || dt.rows.count ");
            foreach (datarow row in dt.rows)
            {
                writer.write("");
                foreach (gridcolumn column in columns)
                {
                    writer.write(string.format("{0}", row[column.datafield]));
                }
                writer.write("");
            }
            writer.write("");
        }
    }
}
1.grid类前面的几个属性相当重要:

(1).designer是设计时支持,需要另外写一个类库来支持。

(2).parsechildren指示页分析器应如何处理页上声明的服务器控件标记中嵌套的内容,也就是这个属性决定了grid内部还可以再嵌套其他内容(为true时才可嵌套),比如columns。

2.继承自controlbase,该类后面会介绍。

3.datasource属性是数据源。

4.columns是grid的内部列,其中[editor(typeof(gridcolumnseditor), typeof(system.drawing.design.uitypeeditor))]这个特性非常重要,该特性指示了该属性columns可以在编辑中编辑。其中gridcolumnseditor是界面编辑的类,后面会介绍。

5.重载render方法。该方法是将grid最终html形式输出。这里以table的形式来实现grid。

(1)将columns中的所有列的列名以table中的th呈现

(2)将数据源转换成datatable,然后遍历每一行,并将每一行的数据以td的形式呈现。

下面来看一下controlbase类。

controlbase.cs

using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
using system.web.ui;

namespace aspnetservercontrol
{
    public class controlbase : control, inamingcontainer
    {
    }
}
controlbase类继承自control类及inamingcontainer接口,这是自定义控件所必须的。

再来看一下notallowwhitespaceliteralsbuilder类

using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
using system.web.ui;

namespace aspnetservercontrol
{
    /// 
    /// 控件内部不允许存在非标签形式的字符串
    /// 
    internal class notallowwhitespaceliteralsbuilder : controlbuilder
    {
        /// 
        /// 不允许空白字符
        /// 
        /// 
        public override bool allowwhitespaceliterals()
        {
            return false;
        }

        /// 
        /// 忽略游离于标签外的字符串
        /// 
        /// 
        public override void appendliteralstring(string s)
        {
        }

        public override type getchildcontroltype(string tagname, system.collections.idictionary attribs)
        {
            return base.getchildcontroltype(tagname, attribs);
        }

    }
}
notallowwhitespaceliteralsbuilder主要是用来控制控件内部不允许存在非标签形式的字符串。

后面将会说明gridcolumnseditor及gridcolumn字段的定义,具体请看《asp.net服务器控件开发的grid实现(二)》