程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> C#+ASP.NET 2.0定制復合組件之高級篇

C#+ASP.NET 2.0定制復合組件之高級篇

編輯:關於ASP.NET

一、增加EnhancedListBox的客戶端功能

為了使用客戶端代碼實現EnhancedListBox中項的重排序,你必須使用 JavaScript腳本,並且要把它們依附到EnhancedListBox的兩個按鈕上。為此, 我建議你使用“往後考慮”的方法。就象編寫一個老式的ASP以前的Web頁面,首 先編寫一些生成HTML文件的JavaScript。為此,最好的方法是運行該控件,然後 觀察其源碼並把它的HTML代碼復制到一個編輯器,再添加JavaScript。列表2( 見下載源代碼)展示了你需要添加到你的控件中的JavaScript的原始形式。然後 ,借助於StringBuilder/StringWriter技術(參考源碼列表3),該控件構建這部 分代碼。該JavaScript代碼由兩部分功能組成:接收一個HTML控件(在本例中是 一個<select>控件);使用選擇索引並且在列表中上下移動它(基本上與我在 本文開始我使用服務器代碼向你展示的一樣)。現在,你要理解,你把該 JavaScript代碼添加到Web控件的何處。為了實現在一個Web表單上有多個 EnhancedListBox控件的情況下,該JavaScript代碼不會被重復復制,你需要使 用Page.ClientScript對象的RegisterClientScriptBlock方法輸出它。

要使這個方法起作用,你必須在重載的OnInit事件中調用它(見源碼中列表4) 。

最後,為使按鈕正確工作,你需要把添加的客戶端方法依附到其上。在列表1 中的代碼中,你會看到引用了一個方法RenderButtons。盡管我沒有把該代碼在 此列出(請參考本文相應源碼),但是它能夠使用我在以前文章中介紹的技術生 成按鈕。當時,在生成實際HTML標簽的之前,標簽屬性是使用AddAttribute方法 以棧式存放的。在此,你使用一樣的技術把客戶端方法依附到你的按鈕。

string s_MoveUp = "MoveItemUp(document.all." +this.ClientID + ");
output.AddAttribute(HtmlTextWriterAttribute.OnClick, s_MoveUp);

記住,MoveItemUp是你已經編寫成功的JavaScript函數之一。在生成用於排 序的按鈕之前,該代碼將以堆棧存放這些JavaScript命令。對於向下(down)按 鈕,你使用一樣的技術。注意,我使用ClientId代表該生成後的控件的ID;但是 ,在這個控件位於一個復合控件內部時,這個屬性要考慮使用父控件的名字。

現在,你可以成功地把該控件應用於一個Web表單中。你可以使用與你操作一 個標准ListBox控件一樣的方式在其上添加一些項。

事實上,這完全是一個投放位置占位符(或ASP.NET ListBox控件)。當你使 用重排序按鈕時,你將看到列表中的項相應地改變順序。現在讓我們先記下這個 問題。如果你把一個按鈕拖動到一個Web表單上(不需要為之添加代碼)並執行一 個回寄,你猜會發生什麼呢?完全與我以前描述的一樣;任何你使用重排序按鈕 作的重排序改變都將恢復到在最近一次回寄之前該控件看上去的狀態。因此,讓 我們修改一下這個問題。

首先,我再添加一些JavaScript(源碼列表5)。注意,這部分代碼被添加到 重載的OnInit方法中並且使用StringBuilder/StringWriter技術進行構建;而且 ,這個JavaScript方法的名字是BuildItemList。這個函數負責構建列表框完整 內容的一個字符串描述並且把該串放到要傳遞到該函數的一個HTML元素的value 屬性中。你可以把這看作是列表內容的一種串行化。該串行化的輸出風格會根據 你自己的設計的不同而有所不同。調用這個JavaScript函數需要依附到該按鈕上 的其它代碼。

string s_MoveUp = "MoveItemUp(document.all." + this.ClientID + "); ";
string s_BuildItemList ="BuildItemList(document.all." + this.ClientID +
",document.all.__" + this.ClientID + "); ";
output.AddAttribute(HtmlTextWriterAttribute.Onclick,MoveUp + " " + BuildItemList);

現在,讓我們來分析一下你發送到BuildItemList函數的兩個參數。第一個參 數相應於生成的控件(<select>標簽)的ID。第二個參數是另外一個ID,與前一 個命名一致,但是前面有一個"__"。這是一個你仍然需要添加到你的Web控件的 隱藏的文本框,它將作為一個“串行化”項列表的占位符。我要在OnPreRender 事件中注冊這個隱藏的文本域。

protected override void OnPreRender(EventArgs e)
{
  base.OnPreRender(e);
  if(Page != null)
  {
Page.ClientScript.RegisterHiddenField("__" + this.ID, "");
  }
}

注意,我已經使用我們的控件的ID來標識隱藏的文本域。

到目前為止,你已經擁有了一個完整功能的Web控件;其中,客戶端 JavaScript被綁定到其中的兩個按鈕上。該JavaScript成功地實現在ListBox中 的項的重排序並且把其內容串行化為一個字符串;然後,該字符串被存儲在一個 隱藏的文本域中。所有這些都發生在客戶端。如果一個回寄發生,不會發生重排 序,因為當重排序時控件的Item服務器屬性還沒有收到你對它作的任何改變的消 息;但是幸運的是,位於隱藏的文本域中的表單的一個串行化快照中發生了這一 變化。現在,你有了可以與Item屬性一起使用的內容了。那麼,接下來,你該如 何實現呢?

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved