自定义控件--基础2
Control類程序按控件的步驟:
呈現(xiàn)控件的步驟
1.RenderControl方法
代碼如下:
protected void RenderControl(HtmlTextWriter writer)
{
if(Visible)
{
Render(writer);
}
}
先判斷Visible,然后進行Render.
2.Render方法
public virtual void Render(HtmlTextWriter writer)
{
RenderChildren(writer);
}
使用HtmlTextWriter將標記字符和文本輸出,然后調(diào)用RenderChildren方法.
3.RenderChildren方法
public virtual void RenderChildren(HtmlTextWriter writer)
{
for(Control c in Controls)
{
c.RenderControl(writer);
}
}
判斷當前控件是否有子控件,然后調(diào)用RenderControl方法,根據(jù)子控件的visible值輸出子控件.
?
下面來看一下控件的事件處理.
1.我們知道Button有一個Click事件,我們打開vs,導航至Button的定義,可以看到如下:
public class Button : WebControl, IButtonControl, IPostBackEventHandler { }
其中IPostBackEventHandler接口是負責處理回發(fā)事件的.如果自定義空間需要處理回發(fā)事件,那么就實現(xiàn)該接口就可以了,我們查看該接口:
// 摘要:// 定義 ASP.NET 服務器控件為處理回發(fā)事件而必須實現(xiàn)的方法。public interface IPostBackEventHandler{// 摘要:// 當由類實現(xiàn)時,使服務器控件能夠處理將窗體發(fā)送到服務器時引發(fā)的事件。//// 參數(shù):// eventArgument:// 表示要傳遞到事件處理程序的可選事件參數(shù)的 System.String。void RaisePostBackEvent(string eventArgument);}
在該接口的RaisePostBackEvent方法中,有一個參數(shù),該參數(shù)表示的是要傳遞給處理程序的參數(shù).
處理回發(fā)事件的步驟如下:
1.自定義服務器控件類必須實現(xiàn)IPostBackEventHandler接口,并實現(xiàn)該接口成員RaisePostBackEvent方法
2.為表單定義UniqueID,以與IPostBackEventHandler服務器控件的UniqueID相對應.
注意:只有為引起回傳的控件的name屬性分配了UniqueID,才能夠正確實現(xiàn)捕獲回傳事件。
?例子如下:
public class Btn : Control,IPostBackEventHandler{public event EventHandler click;public void RaisePostBackEvent(string eventArgument){if (click != null){click(this, EventArgs.Empty);}}protected override void Render(HtmlTextWriter writer){writer.Write("<input type='submit' name='" + this.UniqueID + "' value='click me!'/>");}}
頁面調(diào)用:
<cc1:Btn ID="Btn1" runat="server" οnclick="Btn1_click"></cc1:Btn><asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>protected void Btn1_click(object sender, EventArgs e){Label1.Text = "點擊事件!";}
注意:
EventArgs.Empty表示沒有事件數(shù)據(jù)的事件,而不是表示空事件!
此時,如果控件中存在多個時間,編譯器將會為每一個事件委托生成一個字段,這樣的效率是比較低的,可以采用另一種方式來對事件處理進行優(yōu)化:
我們可以使用EventHandlerList,該類有幾個重要的方法,具體如下:
public void AddHandler(object key, Delegate value);public void AddHandlers(EventHandlerList listToAddFrom);public void RemoveHandler(object key, Delegate value);
示例:
public class Btn : Control, IPostBackEventHandler{private static readonly object EventDBClick = new object();public event EventHandler DBClick{add{Events.AddHandler(EventDBClick, value);}remove{Events.RemoveHandler(EventDBClick, value);}}public void RaisePostBackEvent(string eventArgument){OnDBClick(EventArgs.Empty);}protected virtual void OnDBClick(EventArgs e){EventHandler handler = (EventHandler)Events[EventDBClick];if (handler != null){handler(this, e);}}protected override void Render(HtmlTextWriter writer){writer.Write("<input type='submit' name='" + this.UniqueID + "' value='click me!'/>");}}
轉載于:https://www.cnblogs.com/oneword/archive/2009/12/23/1630962.html
總結
以上是生活随笔為你收集整理的自定义控件--基础2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《秋思》是谁的作品?
- 下一篇: 备案网站管理系统是JSP做的