国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

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

2024-07-10 12:55:33
字體:
來源:轉載
供稿:網友

商業源碼熱門下載www.html.org.cn

在試圖為客戶開發一個在網絡上運行的應用程序時,我發現有關正確使用.net web控件的討論非常少。下面是使用.net web控件的常見問題:

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

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

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

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

  討論將按照下面的順序進行:
  1、創建一個web控件

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

  3、在網頁上正確地使用web控件

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

  我們在這里創建的web控件是一個定制的下拉選擇框,它基于標準版本的sql server或msde的pubs數據庫中的stores表。在開發中我們使用了visual studio .net 2003開發工具和c#編程語言。

  在創建pubs web項目后,第一個任務(至少對于我是如此)是將webform1.aspx文件改名為default.aspx,并修改類,使之與名字相符。然后是在ide環境中創建一個文件夾結構,方便對象的查找。



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



  我將把控件命名為storeselector.ascx。第一步是在表單上添加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();
 adapter.selectcommand = new sqlcommand("select stor_id, stor_name,stor_address, city, state, zip from stores", cnn);
 adapter.fill(data, "stores");
 storelist.datasource = data;
 storelist.datamember = "stores";
 storelist.datatextfield = "stor_name";
 storelist.databind();
 session.add("data", data);
}
#end code
  我在session變量上增加了dataset對象,以使數據在對話存在期間以及控件事件觸發期間傳遞數據時都是可以訪問的。注意,要確保page_onload事件的正確:

#code
private void page_load(object sender, system.eventargs e)
{
 if(!page.ispostback)
 {
  binddata();
 }
}
#end code
  現在我們將新控件拖到default.aspx網頁上,并運行該項目。






  很簡單是吧?下面就該是技巧比較高的部分了。我們希望在default.aspx上添加幾個標簽,反映不斷變化的商店。我們希望每個標簽顯示現在選擇的商店中的一列,在這里我們就需要為storeselector控件和事件參數類創建一個定制事件。下面我們先創建event argument class(storeselectorcommandeventargs.cs):

#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”變量,我們要做的僅僅是創建了其中的一個。下面是定義如何處理事件的代理類(storeselectorcommandeventhandler.cs):

#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, system.eventargs e)
{
 data = (dataset)session["data"];
 onstoreselectorchanged(
  new storeselectorcommandeventargs
  (data.tables["stores"].rows[storelist.selectedindex].itemarray[0].tostring
  (),
  data.tables["stores"].rows[storelist.selectedindex].itemarray[1].tostring(
 ),
 data.tables["stores"].rows[storelist.selectedindex].itemarray[2].tostring(),
 data.tables["stores"].rows[storelist.selectedindex].itemarray[3].tostring(),
 data.tables["stores"].rows[storelist.selectedindex].itemarray[4].tostring(),
 data.tables["stores"].rows[storelist.selectedindex].itemarray[5].tostring(
 )));
}
#end code
  我們來分析一下在這里所作的工作。當selectedindexchanged事件被觸發時,我將它傳遞給為控件創建的新事件,我傳送的數據直接與填寫的dataset相關,所有條目都一個一個地被傳遞給storeselectorcommandeventargs對象,然后觸發事件。


  為了訪問default.aspx網頁的新功能,我們需要在該類的oninit部分添加事件處理程序:




  如上圖所示,storeselectorchanged事件出現在了default.aspx網頁上。下面我們賦予它一個功能。我將在default.aspx網頁上添加6個標簽,隨dropdownlist的變化顯示值:




  現在我們來編寫事件。

  美觀是intellisense是intellisense認可定制的eventarg類屬性的原則:




  最終的事件函數如下所示:

#code
private void storeselector1_storeselectorchanged(object
sender, pubs.controls.storeselectorcommandeventargs e)
{
 label1.text = e.stor_id;
 label2.text = e.stor_name;
 label3.text = e.stor_address;
 label4.text = e.city;
 label5.text = e.state;
 label6.text = e.zip;
}
#end code
  現在我們對該項目進行測試。該網頁一加載,讀者的頭腦中可能會閃現出這樣的念頭:它有問題,但我向你保證保證,該項目沒有任何問題。如果想在網頁一加載時就觸發該事件,我們必須通過設置dropdownlist控件中有選擇的索引屬性在已經創建的控件中進行設置。




  只要我們從dropdownlist中選擇另一個store,標簽就會發生變化:




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

#code
public int selectedindex
{
 get{ return storelist.selectedindex; }
 set
 {
  if(!page.ispostback)
  {
   binddata();
  }
  if(value < storelist.items.count)
  {
   storelist.selectedindex = value;
   onstoreselectorchanged(
    new storeselectorcommandeventargs
     (data.tables["stores"].rows[value].itemarray[0].tostring(),
     data.tables["stores"].rows[value].itemarray[1].tostring(),
     data.tables["stores"].rows[value].itemarray[2].tostring(),
     data.tables["stores"].rows[value].itemarray[3].tostring(),
     data.tables["stores"].rows[value].itemarray[4].tostring(),
     data.tables["stores"].rows[value].itemarray[5].tostring()));
  }
 }
}
#end code
  然后設置default.aspx中page_load事件的屬性:

#code
private void page_load(object sender, system.eventargs e)
{
 // 用戶初始化網頁的代碼
 if(!page.ispostback)
 {
  storeselector1.selectedindex = 0;
 }
}
#end code
  運行該項目時,它就會將表單加載到第一個記錄。

  小結

  希望這篇文章能夠對廣大讀者有一定的幫助。這種類型的web應用程序的開發幾乎沒有什么限制,只要設計得當,我們創建的每個web控件可以在整個web應用程序中使用。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 浦北县| 忻城县| 望江县| 乐至县| 伽师县| 全椒县| 高安市| 河南省| 杭锦后旗| 台东市| 佛学| 杭锦后旗| 临清市| 西畴县| 烟台市| 平潭县| 西盟| 宁强县| 景泰县| 凌源市| 武定县| 瓦房店市| 天峻县| 湖南省| 冷水江市| 澜沧| 崇明县| 英山县| 九寨沟县| 海门市| 霍林郭勒市| 昌平区| 新晃| 临夏县| 库伦旗| 宣武区| 崇州市| 静乐县| 巴彦县| 历史| 兰考县|