自定義控制項(支援模板)

2022-03-16 06:20:30 字數 2458 閱讀 2956

任何控制項都可以包含子控制項。乙個控制項支援模板,其實就是在往它裡面加子控制項。模板是用什麼形式在控制項內公開的呢?想一想,我們用乙個一般的控制項都可以直接用標記來指定屬性,而模板也是使用標記來操作。使用模板的時候,就是用標記的方法給模板賦值,根據「任何控制項都可以包含子控制項」,所以模板裡也可以再包含控制項。因此,模板在控制項定義中就表現為屬性。我們的標記都是用xml形式呈現的,因此,使用模板實際上就是給控制項的某個屬性賦於xml標記這樣的值。

上面的話是否可以看懂呢?看下面的這段標記。

」 runat=」server」>

」 runat=」server」>

hello world !

這是乙個支援模板及資料繫結的自定義控制項。它是這樣完成的。

itemtemplate是乙個itemplate型別的屬性,只要對外公開了此屬性,就可以使控制項支援模板。

//模板

private itemplate itemtemplate;

public itemplate itemtemplate

set}

設定好屬性後,還需要給控制項加乙個類級別的[parsechildren(true)]特性,用來指明將控制項內的xml標記元素視為屬性處理,這樣就可以在標籤內定義自己的模板。

作完這些後,下一步需要做的就是要將模板做為子控制項加入到控制項中。

protected override void createchildcontrols()

else

this.controls.add(new literalcontrol(」no itemtemplate!」));

base.createchildcontrols();

}通過重寫createchildcontrols方法來完成。

只有呼叫databind,才可能將資料繫結到子控制項。因此我們還需要重寫ondatabinding

protected override void ondatabinding(eventargs e)

到這裡,乙個簡單的支援模板的控制項就算完成了,可以自己把上面的東西組合起來看看效果。

我們需要模板一般都是要進行資料繫結的,接下來看看怎麼實現。

<%# container.text%>

上面是一般的繫結表示式,可以看到,其實就是呼叫了乙個物件的屬性,其中container用來表示乘放模板的容器,而text正是該容器的屬性。

一般用templatecontainer特性來指定容器的型別,像這樣:

[templatecontainer(typeof(containercontrol)),browsable(false)]

public itemplate itemtemplate

containercontrol就是乙個容器控制項,其定義如下

public class containercontrol : control,inamingcontainer

}public containercontrol(string text)

}注意,這是乙個控制項,只是沒有向頁面呈現而已。實際上,它的作用就是用來乘放模板。這樣,我們建立模板時就改成了這樣子

containercontrol cc=new containercontrol(text);

this.itemtemplate.instantiatein(cc);

this.controls.add(cc);

下面是這個控制項的完整的** :)

using system;

using system.web.ui;

using system.componentmodel;

namespace cc

set}

//輔助進行繫結的屬性

private string text;

public string text

set}

///

/// 建立子控制項

///

protected override void createchildcontrols()

else

this.controls.add(new literalcontrol(」no itemtemplate!」));

base.createchildcontrols();

}///

/// 在這裡進行檢查並建立模板

///

///

protected override void ondatabinding(eventargs e)

具體使用的頁面,.aspx頁上的標記就像我們一開始那樣,.cs裡的**為

if(!this.ispostback)

在這裡,就算postback了,顯示的頁面還是沒有改變,這主要是因為模板內的控制項各自維持自己的狀態,了解這一點很重要,因為接下來支援資料繫結時需要使用這一點。

還有一點,如果把databind注釋掉了,那text就不會繫結到模板上。你可以實驗一下把ensurechildcontrols放到其他方法中(比如render什麼的),結果都是如此。

自定義控制項 自定義鐘錶

private context mcontext 畫筆 private paint mpaint 控制項的寬 private int mwidth x方向的圓心座標 private int center 鐘錶的半徑 private int mradio 圓環的寬 private int stroke...

自定義控制項

首先是以下這幾項,attribute defaultproperty指定元件的預設屬性,toolboxdata指定當從ide工具中的 工具箱中拖動自定義控制項時為它生成的預設標記 defaultproperty text toolboxdata mycontrol runat server 上面這些...

自定義控制項

新聞管理 using system using system.collections.generic using system.linq using system.web using system.web.ui using system.web.ui.webcontrols namespace ne...