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

首頁 > 編程 > .NET > 正文

ASP.NET中Web DataGrid的使用指南

2024-07-10 13:05:06
字體:
來源:轉載
供稿:網友
很久以前就想寫一些關于datagrid/datalist的東西,但是一直以來,一方面自感所學未深,另一方面,總覺無從下筆,一拖再拖,離剛開始的念頭已距一年有余。
datagrid/datalist在asp.net中的重要性,想必就不用我再強調了,凡顯示table類型的數據,大多會使用這兩個控件(當然,如果誰還像asp那樣寫asp.net,那我也沒有辦法),所以,每個人可能都有自己的領悟,這篇文章,算是拋磚引玉,為大家做個鋪墊。

一、方法
1、databind
很簡單、最常用的方法。綁定數據用。需要注意的只有一點:執行了這個方法后,datagrid(由于datagrid和datalist極為相似,所以下面的介紹雖然是針對datagrid,但與datalist也相差不遠)里面所有的顯示綁定數據的控件,都會顯示datasource里的數據,其余控件也將初始化成.aspx里設計的狀態。


二、屬性
1、datasource
有databind的地方,就應該有datasource。如果沒有指定datasource而執行databind,那datagrid將什么也不會顯示。
datasource一般是dataset、datatable或者dataview。當然也可以綁定datareader或者其他實現ienumerable的類。

2、datakeyfield,datakeys
當你在datagrid中定位一行之后,肯定想知道這行在數據表里的位置,至少有五種方法可以做到這一點,設置datagrid的datakeyfield就是這幾種方法之一。
datakeyfield一般設置為數據表的unique字段(否則就沒意義了),通過datakey可以得到這一行對應的關鍵字段的值。
datakeys是datakey的集合,通過行的索引來讀取相應行的datakey。

3、edititemindex,selectedindex,currentpageindex,selecteditem
這些屬性都很好理解,看名字就知道是什么意思,需要注意的是,設置了edititemindex或者currentpageindex后需要重新執行databind方法(當然,前面提到過,還需要設置datasource)。

4、columns
沒什么好解釋的,columns就是columns,列的集合,可以設置列的屬性,包括visible、headertext、footertext、sortexpression等。
嚴重注意:自動生成的列,是不包含在columns中的。只有在.aspx中顯示聲明的列和在代碼中添加的列才會被包含在其中。

5、items
俗話說,最后的都是最重要的,把items作為最后一個屬性來介紹,正式基于這樣的理由。
items是datagriditem的集合,可以遍歷當前datagrid中顯示數據的datagriditem。
5.1、datagriditem
每一個datagriditem就是datagrid中顯示的一行,其中包括:
header datagrid 控件的標題部分
item datagrid 控件中的項
alternatingitem datagrid 控件中的交替項
selecteditem datagrid 控件中的選定項(由selectedindex設置,通過selecteditem屬性或者items[selectedindex]來讀取)
edititem datagrid 控件中處于編輯狀態的項(由edititemindex設置,通過items[edititemindex]來讀取)
separator datagrid 控件中項之間的分隔符
footer datagrid 控件的腳注部分
pager datagrid 控件的頁選擇節
注意,datagrid的items屬性中不會包含header、footer、pager這三類datagriditem的。
5.1.1、datagriditem的屬性
itemindex —— 得到行在items中的索引
itemtype —— 返回行的類型,也就是上面列出的header、item、...、pager
cells —— 返回行包含的所有tablecell(不管是顯示聲明的,還是自動生成的,不管是可以看見的,還是隱藏掉的),通過tablecell,可以讀取cell中顯示的文本、包含的控件
嚴重注意:只有boundcolumn列和自動生成列,才可以通過tablecell.text屬性讀取顯示的文本。hyperlinkcolumn、buttoncolumn、editcommandcolumn都需要將目標控件轉換成相應的控件。
比如:
假設datagrid的第一列聲明如下
<asp:hyperlinkcolumn datatextfield="au_id" headertext="au_id" datanavigateurlfield="au_id" datanavigateurlformatstring="edit.aspx?id={0}"></asp:hyperlinkcolumn>
讀取的時候可以用:
//items[0]表示第一行,cells[0]表示第一列,controls[0]表示cell中的第一個控件(也只有這個控件可以用)
hyperlink link = (hyperlink)datagrid1.items[0].cells[0].controls[0]);
response.write(link.text);
至于模板列(templatecolumn),當然也可以通過datagrid1.items.cells[j].controls[n]來獲取,然后轉換成原來的控件類型再操作,但是還有個更好的辦法,就是用findcontrol來查找控件。
findcontrol是system.web.ui.control的方法,可以根據子控件id來查找子控件
比如:
假設datagrid的某一列聲明如下
<asp:templatecolumn>
<itemtemplate>
<asp:textbox runat="server" id="txtid" text=<%# databinder.eval(container.dataitem,"au_id") %>>
</asp:textbox>
</itemtemplate>
</asp:templatecolumn>
讀取方法:
textbox txt = (textbox)datagrid1.items[1].findcontrol("txtid");
response.write(txt.text);
注意:datalist中是沒有cell的


三、事件
1、itemcommand、cancelcommand、deletecommand、editcommand、updatecommand
也就是datagrid中,點擊button、linkbutton后執行的事件,執行的事件取決于按鈕的commandname。其實最主要的一個是itemcommand,而后面四個都只是itemcommand的一小部分,
比如一個按鈕的commandname為"cancel",當返回后,首先執行的是itemcommand事件,然后才是cancelcommand事件。

2、pageindexchanged
如果你的datagrid是分頁的,那當你在datagrid上點擊pager上的1、2、3或者<、>時,就會激發這個事件。
在這個事件里面,你可以用e.newpageindex來讀取要改變的頁,然后賦值給datagrid的currentpageindex屬性,最后不要忘了,還要設置datasource,還要執行databind。
注意:datalist中沒有這個事件,如果需要在datalist中分頁,可以一段一段的讀取數據,然后把當前段的數據綁定到datalist上。

3、itemdatabound,itemcreated
首先要說的是這兩個事件的發生時間。
itemdatabound嘛,只要執行了databind方法,就會馬上激發這個事件。
itemcreated呢,如果頁面是第一次訪問(page.ispostback = false),那在第一次執行databind的時候,會先激發itemcreated事件,也就是說,執行了databind后,首先會用itemcreated來建立header行,然后用itemdatabound來綁定header行,再用itemcreated來建立第一行,再調用itemdatabound來綁定第一行,也就是說itemcreated和itemdatabound是交替執行的。
頁面返回時,也會執行itemcreated
事件,在page_load之前,但是這時候就不會再執行itemdatabound事件了。
所以,如果你想在datagrid里動態添加什么控件,就需要在itemcreated事件中,而不是在itemdatabound事件中。


四、代碼片斷
1、datagrid顯示雙層表頭
假設你的datagrid有三列,現在想將前兩列作為"大類1",第三列作為"大類2",現在,你可以在itemdatabound事件中加入下面的代碼:
if (e.item.itemtype == listitemtype.header)
{
e.item.cells[0].columnspan = 2;
e.item.cells[0].text = "大類1</td><td>大類2</td></tr><tr><td>" + e.item.cells[0].text;
}
用這個方法可以為任意添加新行。

2、設置綁定列或者自動生成列的編輯框寬度
請在你的itemdatabound事件中加入一下代碼:
if (e.item.itemtype == listitemtype.edititem)
{
for (int i = 0; i < e.item.cells.count; i++)
{
textbox txt = (textbox)e.item.cells.controls[0];
txt.width = unit.pixel(50);
}
}

3、處理在datagrid中的dropdownlist的事件
dropdownlist沒有commandname屬性,所以不能用itemcommand事件,不過你可以這樣試試:
在datagrid的模板列中加入的dropdownlist控件
<asp:dropdownlist runat="server" id="ddl" autopostback="true" onselectedindexchanged="ddl_selectedindexchanged" />
然后你在.aspx.cs中加入一個函數
protected void ddl_selectedindexchanged(object sender, system.eventargs e) //一定要聲明成protected或者public,不能是private的。
{
//在這里就可以加入其他代碼
}

3.1、在上面的事件中怎樣得到本行其他cell的值呢?
我們知道,datagrid完全是一個table結構的控件,datagrid包含datagriditem,每個datagriditem又包含tablecell,那么,我們就可以在tablecell的某個控件中,利用控件的parent來得到tablecell,再利用tablecell的parent,就可以得到datagriditem了。
protected void ddl_selectedindexchanged(object sender, system.eventargs e) //一定要聲明成protected或者public,不能是private的。
{
dropdownlist ddl = (dropdownlist)sender;
tablecell cell = (tablecell)ddl.parent;
datagriditem item = (datagriditem)cell.parent;
response.write(item.cells[0].text);
}

4、怎樣得到header、footer、pager里的控件
方法一:在itemcreated或者itemdatabound中,具體代碼就不在多寫了
方法二:遍歷datagrid的所有item(注意,不是遍歷datagrid1.items下的item)
foreach (datagriditem item in datagrid1.controls[0].controls)
{
if (item.itemtype == listitemtype.header)
{
//用item.findcontrol查找相應的控件
}
}
大家可能會注意到,這里有個datagrid1.controls[0].controls,這表示,datagrid1下,有一個子控件,這個子控件是datagridtable類型,他下面才是datagriditem集合
在datalist中,下面的子控件直接就是datalistitem了,而沒有table:
foreach (datalistitem item in datalist1.controls)
{
//....
}




收集最實用的網頁特效代碼!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 延吉市| 平度市| 通城县| 墨玉县| 安吉县| 古浪县| 类乌齐县| 六安市| 德庆县| 庆云县| 边坝县| 普安县| 定兴县| 蒲江县| 噶尔县| 庆云县| 正阳县| 垦利县| 甘德县| 垫江县| 张家界市| 靖宇县| 法库县| 仙桃市| 乐陵市| 聊城市| 千阳县| 建宁县| 门源| 呈贡县| 察隅县| 巴彦淖尔市| 文成县| 克拉玛依市| 夏津县| 油尖旺区| 会昌县| 蚌埠市| 云和县| 交口县| 孟州市|