熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET中設計帶事件定制控件

2013-11-13 09:53:46  來源: .NET編程 
在試圖為客戶開發一個在網絡上運行的應用程序時我發現有關正確使用NET Web控件的討論非常少下面是使用NET Web控件的常見問題

  如何使這些控件間相互通訊?

  如何使這些控件保持狀態?

  如何將多個控件有效地聯接在一個網頁上?

  我是一名ASP開發人員發現轉向ASPNET並非是件輕而易舉的事我最初的想法是通過Session對象或使用查詢語句保持狀態但發現這二種方法都太邋遢而且當試圖對網頁上的所有Web控件進行同步時就會出現問題我在偶然間發現了一篇有關在Web控件中創建事件的文章但在實踐中仍然吃足了苦頭因此我認為提供一個有關正確地創建Web控件並同時創建定制事件的實例是非常重要的

  討論將按照下面的順序進行
  創建一個Web控件

  創建控件的定制事件和事件參數

  在網頁上正確地使用Web控件

  在討論期間我還會向讀者提供一些小技巧使讀者能夠更精確和快速地開發應用程序

  我們在這裡創建的Web控件是一個定制的下拉選擇框它基於標准版本的SQL Server或MSDE的pubs數據庫中的stores表在開發中我們使用了Visual Studio NET 開發工具和C#編程語言

  在創建Pubs Web項目後第一個任務(至少對於我是如此)是將WebFormaspx文件改名為Defaultaspx並修改類使之與名字相符然後是在IDE環境中創建一個文件夾結構方便對象的查找


  我創建了Controls目錄存儲所有創建的控件以更方便地訪問它們根據創建控件時的粒度我們可以進一步地細分Controls目錄

  我將把控件命名為StoreSelectorascx第一步是在表單上添加DropDownList控件


  現在就該為該控件布線創建一個Dataset類的對象

  #code
private DataSet data;
#end code


  創建向下拉列表中填寫數據的BindData功能

  #code
private void BindData()
{
 data = new DataSet();
 SqlConnection cnn = new SqlConnection(Data Source=(local);Initial
 Catalog=pubs;Integrated Security=SSPI);
 SqlDataAdapter adapter = new SqlDataAdapter();
 adapterSelectCommand = new SqlCommand(SELECT stor_id stor_name

  stor_address city state zip FROM stores cnn);
 adapterFill(data stores);
 storeListDataSource = data;
 storeListDataMember = stores;
 storeListDataTextField = stor_name;
 storeListDataBind();
 SessionAdd(Data data);
}
#end code


  我在Session變量上增加了DataSet對象以使數據在對話存在期間以及控件事件觸發期間傳遞數據時都是可以訪問的注意要確保Page_OnLoad事件的正確

  #code
private void Page_Load(object sender SystemEventArgs e)
{
 if(!PageIsPostBack)
 {
  BindData();
 }
}
#end code


  現在我們將新控件拖到Defaultaspx網頁上並運行該項目

  很簡單是吧?下面就該是技巧比較高的部分了我們希望在Defaultaspx上添加幾個標簽反映不斷變化的商店我們希望每個標簽顯示現在選擇的商店中的一列在這裡我們就需要為StoreSelector控件和事件參數類創建一個定制事件下面我們先創建Event Argument Class(StoreSelectorCommandEventArgscs)

  #code
public class StoreSelectorCommandEventArgs
{
 private string _stor_id;
 private string _stor_name;
 private string _stor_address;
 private string _city;
 private string _state;
 private string _zip;

 public StoreSelectorCommandEventArgs(string stor_id string stor_name
 string stor_address string city string state string zip)
 {
  _stor_id = stor_id;
  _stor_name = stor_name;
  _stor_address = stor_address;
  _city = city;
  _state = state;
  _zip = zip;
 }

 public string stor_id{ get{ return _stor_id; } }
 public string stor_name{ get{ return _stor_name; } }
 public string stor_address{ get{ return _stor_address; } }
 public string city{ get{ return _city; } }
 public string state{ get{ return _state; } }
 public string zip{ get{ return _zip; } }
}
#end code


  該類的目的是為了處理定義事件參數的e變量我們要做的僅僅是創建了其中的一個下面是定義如何處理事件的代理類(StoreSelectorCommandEventHandlercs)

  #code
public delegate void StoreSelectorCommandEventHandler(object sender
StoreSelectorCommandEventArgs e);
#end code

  下面是產生的文件

  現在我們來調整StoreSelector控件觸發事件



  下面的代碼需要添加到StoreSelector控件中才可能執行我們創建的事件

  #code
public event StoreSelectorCommandEventHandler StoreSelectorChanged;
protected virtual void OnStoreSelectorChanged(StoreSelectorCommandEventArgs e)
{
 if(StoreSelectorChanged != null) StoreSelectorChanged(this e);
}
#end code


  現在我們已經為控件定義了事件我們需要觸發該事件我們計劃在DropDownList OnChange事件被觸發後觸發該事件注意確保DropDownList控件的AutPostBack屬性被設置為真

  下面是事件的代碼

  #code
private void storeList_SelectedIndexChanged(object sender SystemEventArgs e)
{
 data = (DataSet)Session[Data];
 OnStoreSelectorChanged(
  new StoreSelectorCommandEventArgs
  (dataTables[stores]Rows[storeListSelectedIndex]ItemArray[]ToString
  ()
  dataTables[stores]Rows[storeListSelectedIndex]ItemArray[]ToString(
 )
 dataTables[stores]Rows[storeListSelectedIndex]ItemArray[]ToString()
 dataTables[stores]Rows[storeListSelectedIndex]ItemArray[]ToString()
 dataTables[stores]Rows[storeListSelectedIndex]ItemArray[]ToString()
 dataTables[stores]Rows[storeListSelectedIndex]ItemArray[]ToString(
 )));
}
#end code


  我們來分析一下在這裡所作的工作當SelectedIndexChanged事件被觸發時我將它傳遞給為控件創建的新事件我傳送的數據直接與填寫的dataset相關所有條目都一個一個地被傳遞給StoreSelectorCommandEventArgs對象然後觸發事件

  為了訪問Defaultaspx網頁的新功能我們需要在該類的OnInit部分添加事件處理程序

  如上圖所示StoreSelectorChanged事件出現在了Defaultaspx網頁上下面我們賦予它一個功能我將在Defaultaspx網頁上添加個標簽隨DropDownList的變化顯示值

  現在我們來編寫事件

  美觀是Intellisense是Intellisense認可定制的EventArg類屬性的原則

  最終的事件函數如下所示

  #code
private void StoreSelector_StoreSelectorChanged(object
sender PubsControlsStoreSelectorCommandEventArgs e)
{
 LabelText = estor_id;
 LabelText = estor_name;
 LabelText = estor_address;
 LabelText = ecity;
 LabelText = estate;
 LabelText = ezip;
}
#end code


  現在我們對該項目進行測試該網頁一加載讀者的頭腦中可能會閃現出這樣的念頭它有問題但我向你保證保證該項目沒有任何問題如果想在網頁一加載時就觸發該事件我們必須通過設置DropDownList控件中有選擇的索引屬性在已經創建的控件中進行設置

  只要我們從DropDownList中選擇另一個Store標簽就會發生變化

  現在我們使表單加載到第一個記錄我們在StoreSelector控件上添加下面的屬性

  #Code
public int SelectedIndex
{
 get{ return storeListSelectedIndex; }
 set
 {
  if(!PageIsPostBack)
  {
   BindData();
  }
  if(value < storeListItemsCount)
  {
   storeListSelectedIndex = value;
   OnStoreSelectorChanged(
    new StoreSelectorCommandEventArgs
     (dataTables[stores]Rows[value]ItemArray[]ToString()
     dataTables[stores]Rows[value]ItemArray[]ToString()
     dataTables[stores]Rows[value]ItemArray[]ToString()
     dataTables[stores]Rows[value]ItemArray[]ToString()
     dataTables[stores]Rows[value]ItemArray[]ToString()
     dataTables[stores]Rows[value]ItemArray[]ToString()));
  }
 }
}
#End Code
  然後設置Defaultaspx中Page_Load事件的屬性

  #code
private void Page_Load(object sender SystemEventArgs e)
{
 // 用戶初始化網頁的代碼
 if(!PageIsPostBack)
 {
  StoreSelectorSelectedIndex = ;
 }
}
#end code


  運行該項目時它就會將表單加載到第一個記錄

  小結

  希望這篇文章能夠對廣大讀者有一定的幫助這種類型的Web應用程序的開發幾乎沒有什麼限制只要設計得當我們創建的每個Web控件可以在整個Web應用程序中使用


From:http://tw.wingwit.com/Article/program/net/201311/11891.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.