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

首頁 > 編程 > .NET > 正文

Asp.Net中DataGrid的模版列(TemplateColumn)內(nèi)容控制簡單方法

2024-07-10 12:56:47
字體:
供稿:網(wǎng)友

最近寫了幾個(gè)asp.net的項(xiàng)目。其中,asp.net的控件datagrid使用的最多了,前幾天需要一個(gè)功能,我研究了很長時(shí)間,發(fā)現(xiàn)一個(gè)方法,應(yīng)該是最簡單的實(shí)現(xiàn)。現(xiàn)表述如下。

datagrid的html定義很簡單,如下 <asp:datagrid id="mydatagrid" runat="server" datakeyfield="fid" autogeneratecolumns="false">
<columns>
<asp:templatecolumn itemstyle-width=".." ..>
<itemtemplate>
.
</itemtemplate>
</asp:templatecolumn>
</columns>
</asp:datagrid>
功能的要求是在 itemtemplate中,有可能是一個(gè)綁定數(shù)據(jù)源的:
<a href="...">...</a>
鏈接代碼,也有可能是一個(gè)
<span>...</span>
顯示文本代碼,而判斷的根據(jù)是綁定到datagrid中數(shù)據(jù)源的datatable中每行的某一特定列的內(nèi)容。

說白了,功能就是datagrid在綁定數(shù)據(jù)生成行的時(shí)候,判斷數(shù)據(jù)源datatable每行datarow中一個(gè)字段的內(nèi)容,這個(gè)字段類型是bool類型,如果為true,則這個(gè)列顯示的是<a href="...">...</a>鏈接,而如果是false,則顯示<span>...</span>文本。而顯示的鏈接內(nèi)指向的地址必須執(zhí)行數(shù)據(jù)綁定。就是這個(gè)datagrid的列有的行要數(shù)據(jù)綁定,有的行不要數(shù)據(jù)綁定。

功能需求分析到這里,那么現(xiàn)在該思考如何實(shí)現(xiàn)了。

我當(dāng)時(shí)了解需求后,馬上反應(yīng)出來,使用datagrid自帶的boundcolumn、hyperlinkcolumn肯定是不行的。而且,使用templatecolumn也有麻煩。他只能放一些固定的控件,如html控件或服務(wù)器控件等。后來我沒有辦法了,準(zhǔn)備繼承itemplate接口自己開發(fā)一個(gè)模版列。后來又覺得麻煩。因?yàn)榻壎ǖ臅r(shí)候需要一個(gè)類似于boundcolumn功能的綁定數(shù)據(jù)源內(nèi)容的東西。后來我發(fā)現(xiàn)了這個(gè)方法。

在查看.net framework sdk 文檔的時(shí)候,我發(fā)現(xiàn)在<asp:templatecolumn>中的<itemtemplate>中可以放類似于
<%# databinder.eval(container.dataitem, "fid") %> 這樣的數(shù)據(jù)綁定代碼,我就想是否可以再加入代碼呢

我做了一個(gè)試驗(yàn),試驗(yàn)結(jié)果發(fā)現(xiàn)上面的代碼(包括前面和后面的<% %>符號(hào))輸出的實(shí)際上是一個(gè)object對(duì)象,然后datagrid顯示的時(shí)候把它轉(zhuǎn)換成字符串。后來我就想,是否可以前面再加入代碼,調(diào)用這個(gè)頁面的后臺(tái)代碼中的方法。

我們都知道,在asp.net1.1中,一個(gè)名稱為aaa.aspx的asp.net頁在asp.net內(nèi)部處理時(shí)是一個(gè)名叫asp.aaa_aspx的類,這個(gè)類繼承它的后臺(tái)代碼aaa.aspx.cs中的類,這個(gè)類繼承system.web.ui.page類,從而實(shí)現(xiàn)需要的功能。這就是說,在asp.net 1.1中,我們?cè)?aspx中的以<% %> 包含的代碼可以調(diào)用后臺(tái)cs類中的以public 和protected生命的任何方法。

這就好辦了,既然從上面的數(shù)據(jù)綁定代碼可以獲取主鍵內(nèi)容(是個(gè)字符串),那么我可以在后臺(tái)寫一個(gè)方法,這個(gè)方法有一個(gè)字符串參數(shù),返回的也是字符串。這個(gè)返回的字符串就是顯示在列中的內(nèi)容。

首先說一下綁定表的內(nèi)容,如下

列名 類型 用途
fid system.string 表主鍵
hassub system.boolean 判斷的依據(jù)
contenturl system.string 鏈接的地址

然后是后臺(tái)代碼中c#代碼
protected string getdgcolumn(string id)
{
// 從數(shù)據(jù)源獲取datatable內(nèi)容略
datatable dt = .;
// 定義datatable的主鍵列
datacolumn[] key = {dt.columns["fid"]};
dt.primarykey = key;

// 根據(jù)傳入的id開始找數(shù)據(jù)行
datarow row = dt.rows.find(id);

// 找到后開始判斷
if((bool)row["hassub"])
{
// hassub為 true,表示返回<span>
return "<span style=/"/">內(nèi)容內(nèi)容</span>";
}
else
{
// hassub列為false,返回鏈接
return "<a href=/"xxxx.aspx?id="+id+"/" target=/"_blank/">鏈接內(nèi)容</a>";
}
}

然后在.aspx中的daagrid內(nèi)這樣定義:
<asp:datagrid id="mydatagrid" runat="server" datakeyfield="fid" autogeneratecolumns="false">
<columns>
<asp:templatecolumn itemstyle-width=".." ..>
<itemtemplate>
<%# base.getdgcolumn((object)databinder.eval(container.dataitem, "fid")) %>
</itemtemplate>
</asp:templatecolumn>
</columns>
</asp:datagrid>

利用了datagrid綁定時(shí)內(nèi)部使用的數(shù)據(jù)綁定方法獲取結(jié)果,然后把結(jié)果傳遞給getdgcolumn()方法,datagrid列的內(nèi)容實(shí)際上是使用的這個(gè)方法返回的字符串。


好了,一個(gè)隨心所欲生成datagrid列內(nèi)容的方法說完了,不知道大家有沒有更好的方法。
我這個(gè)方法的缺點(diǎn)就是生成的內(nèi)容沒有辦法執(zhí)行服務(wù)器提交,它無法被服務(wù)器段區(qū)分開,所以只能是使用靜態(tài)的鏈接,文本等。還有就是可以調(diào)用客戶端的js腳本。如果誰有更好的方法,如生成的鏈接按鈕的單擊事件可以被服務(wù)器端區(qū)分,請(qǐng)指教。如果大家有更好的方法,也請(qǐng)指教。我在這里謝謝大家了。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宜昌市| 巨野县| 邹城市| 广西| 布拖县| 内江市| 曲阜市| 乐都县| 株洲县| 黔南| 分宜县| 洛隆县| 浦城县| 介休市| 荥阳市| 永春县| 买车| 商洛市| 墨竹工卡县| 当雄县| 高平市| 上杭县| 普兰县| 青铜峡市| 丘北县| 远安县| 邓州市| 湖口县| 会同县| 布尔津县| 吉安市| 钟祥市| 紫金县| 昭通市| 洱源县| 湖州市| 会泽县| 宾川县| 天气| 玉门市| 大洼县|