Asp.Net伺服器控制元件開發的Grid實現(三)列編輯器

_學而時習之_發表於2014-10-29

下面是GridColumnsEditor的實現程式碼:

GridColumnsEditor.cs

using System;
using System.Collections.Generic;
using System.ComponentModel.Design;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.UI.WebControls;

namespace AspNetServerControl
{
    public class GridColumnsEditor : CollectionEditor
    {
        private Type[] types;

        /// <summary>
        /// 建構函式
        /// </summary>
        /// <param name="type">控制元件型別</param>
        public GridColumnsEditor(Type type)
            : base(type)
        {
            types = new Type[] { 
                typeof(BoundField)
            };
        }

        /// <summary>
        /// 獲取此集合編輯器可包含的資料型別
        /// </summary>
        /// <returns>型別集合</returns>
        protected override Type[] CreateNewItemTypes()
        {
            return types;
        }
    }
}
GridColumnsEditor繼承自CollectionEditor,CollectionEditor可以給使用者提供一個編輯的介面,並集合大部分的資料型別。

在建構函式中GridColumnsEditor(Type type)中,只實現了一個BoundField欄位,如果需要其他的欄位,可以在後面新增。比如

types = new Type[] { 
                typeof(BoundField),
		typeof(CheckField)
            };
下面看一下BoundField欄位的實現

 /// <summary>
    /// 表格資料繫結列
    /// </summary>
    [ToolboxItem(false)]
    [ParseChildren(true)]
    [PersistChildren(false)]
    public class BoundField : GridColumn
    {

    }
BoundField繼承自GridColumn類,這裡也有一個ParseChildren屬性,主要是為了巢狀。

下面看一下GridColumn的實現

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Web.UI;

namespace AspNetServerControl
{
    /// <summary>
    /// 表格列基類(抽象類)
    /// </summary>
    [ToolboxItem(false)]
    [ParseChildren(true)]
    [PersistChildren(false)]
    [DefaultProperty("HeaderText")]
    public class GridColumn : ControlBase
    {
        private string _headerText = String.Empty;
        /// <summary>
        /// 標題欄顯示的文字
        /// </summary>
        [Category(CategoryName.OPTIONS)]
        [DefaultValue("")]
        [Description("標題欄顯示的文字")]
        public string HeaderText
        {
            get
            {
                return _headerText;
            }
            set
            {
                _headerText = value;
            }
        }


        private string _dataField = String.Empty;
        /// <summary>
        /// 欄位名稱
        /// </summary>
        [Category(CategoryName.OPTIONS)]
        [DefaultValue("")]
        [Description("欄位名稱")]
        public string DataField
        {
            get
            {
                return _dataField;
            }
            set
            {
                _dataField = value;
            }
        }
    }
}
GridColumn也繼承自ControlBase,所以GridColumn其實也是一個控制元件,只不過我們將其巢狀在了Grid中。

在Grid中定義Columns的屬性時,我們用的是GridColumnCollection類,而該類是一個GridColumn的集合,程式碼如下。

public class GridColumnCollection : Collection<GridColumn>
    {
        public GridColumnCollection(ControlBase parent)
        {

        }
    }

再看GridColumn類中,我們定義了HeaderText和DataField屬性,這兩個屬性就是我們在default.aspx頁面中編輯Grid時,給BoundField新增的屬性。

到此,整個Grid的封裝就算完成了。

如果結合jquerymobile,可以在Grid的Render函式中,依據jquerymobile的表格標記輸出。

對於Grid的回發事件處理,請參看《Asp.Net伺服器控制元件開發的Grid實現(四)回發事件



相關文章