Asp.Net伺服器控制項開發的Grid實現(一),asp.netgrid

來源:互聯網
上載者:User

Asp.Net伺服器控制項開發的Grid實現(一),asp.netgrid

使用Asp.Net做Web開發時,系統提供的控制項,有時難以達成所要的目的。這時,有多種方式可以解決,比如採用html+js的形式,在前端布局出所要的介面,然後再通過ajax等方式去擷取資料,以達成目的。

但這樣做,很是費勁,特別是當布局出來的介面需要重用的時候,更加費勁。有人,會直接將該介面的代碼進行拷貝,但這對後來的維護必然帶來更大的問題。所以就考慮,有沒有一種方式可以讓布局得到重用,又便於維護的。Asp.Net的控制項可以很方便的布局,同時又能在後台中直接操作控制項,實現相關的資料邏輯。所以就想借用asp.net的技術,來自行封裝出控制項。

有的人會說,直接使用asp.net的使用者自訂控制項封裝,不也可以達到目的嗎?在一定程度上,確實是可以的。但是如果,我們需要更多的特性的時候,這個依然很難滿足要求。特別是當我們在移動端使用一些庫進行開發時,問題會更嚴重。

比如在移動端使用JqueryMobile進行開發時,由於JqueryMobile是基於前端的,所以對於後端的使用會有些棘手。這種情況,就可以考慮asp.net+jquerymobile來達成。(使用asp.net mvc4來結合jquerymobile的不屬性該範圍)

我們通過簡單的封裝,來實現一個Grid控制項。先看一下。


該的前後面代碼如下:

前端代碼default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="Demo._default" %><!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />    <title></title></head><body>    <form id="form1" runat="server">        <div>            <S:Grid runat="server" ID="Grid_Edit">                <Columns>                    <S:BoundField runat="server" ID="BoundField1" HeaderText="貨號" DataField="NO" />                    <S:BoundField runat="server" ID="BoundField2" HeaderText="類型" DataField="Type" />                    <S:BoundField runat="server" ID="BoundField3" HeaderText="狀態" DataField="Status" />                </Columns>            </S:Grid>        </div>    </form></body></html>
其中帶S首碼的控制項就是封裝的Grid控制項。

後面代碼default.aspx.cs

using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;namespace Demo{    public partial class _default : System.Web.UI.Page    {        protected void Page_Load(object sender, EventArgs e)        {            if (!IsPostBack)            {                InitLoad();            }        }        private void InitLoad()        {            Grid_Edit.DataSource = GenerateData();        }        private DataTable GenerateData()        {            DataTable dt = new DataTable();            dt.Columns.Add("NO");            dt.Columns.Add("Type");            dt.Columns.Add("Status");            dt.Rows.Add(new String[] { "H10001", "食品", "已售完" });            dt.Rows.Add(new String[] { "H10002", "蔬菜", "待銷售" });            dt.Rows.Add(new String[] { "H10003", "水果", "待銷售" });            dt.Rows.Add(new String[] { "H10004", "器具", "銷售中" });            return dt;        }    }}
給Grid_Edit的DataSource賦值。

從代碼中可以看到,S:Grid內部有一個Columns,在Columns中還有S:BoundField欄位,在S:BoundField欄位中有HeaderText和DataField屬性。

其中HeaderText就是列頭,DataField就是綁定的欄位,與後台代碼的DataSource的欄位對應。

這種操作方式與Asp.Net的GridView相似。

所以我們要封裝出一個Grid,至少需要做以下幾件事:

1.定義一個Grid類

2.在Grid類中包含Columns的屬性。

3.在Columns的屬性中,必須能夠容納BoundField欄位。

4.必須在編輯器中能夠直接敲出<Columns>。

具體實現,請看《Asp.Net伺服器控制項開發的Grid實現(二)》





怎開發aspnet 伺服器控制項

1:使用者控制項很簡單,相信樓主不是跑這裡來問這個吧。
2:如果是自訂控制項,那可能就比較麻煩了,這個應該說是屬於另一個領域了。樓主需要在網上找些自訂控制項的一些資料。
自訂控制項比較麻煩(如:Word編輯框、分頁控制項),這個需要樓主自己來學了。
我個人認為,一般的程式,用使用者控制項就完全可以解決了。
"是asp.net的一些控制項不符合我的使用習慣,想自己編寫一些符合自己習慣的",呵呵,不知道樓主這個習慣好不好。建議樓主符合微軟的思想、習慣...這樣有助於更深的理解和學習asp.net。
 
ASPNet中伺服器控制項的生命週期

(1)初始化:在此階段中,主要完成兩項工作:一、初始化在傳入Web請求生命週期內所需的設定;二、跟蹤檢視狀態。首先,頁面架構通過預設引發Init事件,並調用OnInit()方法,控制項開發人員可以重寫該方法為控制項提供初始化邏輯。此後,頁面架構將調用TrackViewState方法來跟蹤檢視狀態。需要注意的是:多數情況下,Control基類提供的TrackViewState方法實現已經足夠了。只有在控制項定義了複雜屬性時,開發人員才可能需要重寫TrackViewState方法。

(2)載入檢視狀態:此階段的主要任務是檢查ASP.NET伺服器控制項是否存在以及是否需要將其狀態恢複到它在處理之前的請求結束的狀態。因此該過程發生在頁面回傳過程中,而不是初始化請求過程。在此階段,頁面架構將自動回復ViewState字典。如果伺服器控制項不維持其狀態,或者它有能力通過預設儲存其所有狀態而使用ViewState字典,那麼開發人員則不必實現任何邏輯。針對那些無法在 ViewState字典中儲存的資料類型或者需要自訂狀態管理的情況,開發人員可以通過重寫LoadViewState方法來自訂狀態的恢複和管理。

(3)處理回傳資料:若要使控制項能夠檢查用戶端發回的表單資料,那麼必須實現System.Web.UI.IPostBackDataHandler介面的 LoadPostData()方法。因此只有處理回傳資料的控制項參與此階段。

(4)載入:至此階段開始,控制項樹中的ASP.NET伺服器控制項已建立並初始化、狀態已還原並且表單控制項反映了用戶端的資料。此時,開發人員可以通過重寫OnLoad()方法來實現每個請求共同的邏輯。

(5)發送回傳更改通知:在此階段,ASP.NET伺服器控制項通過引發事件作為一種訊號,表明由於回傳而發生的控制項狀態變化(因此該階段僅用於回傳過程)。為了建立這種訊號,開發人員必須再次使用System.Web.UI.IPostBackDataHandler介面,並實現另一方法- RaisePostBackChangedEvent()。其判斷過程為:如果控制項狀態因回傳而更改,則LoadPostData()返回true;否則返回false。頁面架構跟蹤所有返回true的控制項並在這些控制項上調用RaisePostDataChangedEvent()。

(6)處理回傳事件:該階段處理引起回傳的用戶端事件。為了便於將用戶端事件映射到伺服器端事件上進行處理,開發人員在此階段可以通過實現 System.Web.UI.IPostBackEventHandler介面的RaisePostBackEvent()方法來實現該邏輯。由此途徑,伺服器控制項將成功捕獲回傳的用戶端事件進行伺服器端的相應處理。

(7)預呈現:該階段完成在產生控制項之前所需要的任何工作。通常情況下是通過重寫OnPreRender()方法完成該工作。需要注意的是:在該階段,可以儲存在預呈現階段對控制項狀態所做的更改,而在呈現階段進行的更改則會丟失。

(8)儲存狀態:如果ASP.NET伺服器控制項不維持狀態,或者它有能力通過預設儲存其所有狀態而使用ViewState字典,那麼開發人員不必在該階段實現任何邏輯。因為這個儲存狀態的過程是自動的。如果ASP.NET伺服器控制項需要自訂狀態儲存,或者控制項無法在ViewState字典中儲存特殊的資料類型,則需要通過重寫SaveViewState()方法來實現狀態儲存。

(9)呈現:表示向HTTP輸出資料流中寫入標記文本的過程。開發人員通過重寫Render()方法使......餘下全文>>
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.