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

首頁 > 開發(fā) > 綜合 > 正文

轉(zhuǎn)貼:DataGrid/DataList

2024-07-21 02:21:59
字體:
供稿:網(wǎng)友
,歡迎訪問網(wǎng)頁設計愛好者web開發(fā)。datagrid/datalist在asp.net中的重要性,想必就不用我再強調(diào)了,凡顯示table類型的數(shù)據(jù),大多會使用這兩個控件(當然,如果誰還像asp那樣寫asp.net,那我也沒有辦法),所以,每個人可能都有自己的領悟,這篇文章,算是拋磚引玉,為大家做個鋪墊。

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


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

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

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

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

5、items
俗話說,最后的都是最重要的,把items作為最后一個屬性來介紹,正式基于這樣的理由。
items是datagriditem的集合,可以遍歷當前datagrid中顯示數(shù)據(jù)的datagriditem。
5.1、datagriditem
每一個datagriditem就是datagrid中顯示的一行,其中包括:
header            datagrid 控件的標題部分
item            datagrid 控件中的項
alternatingitem        datagrid 控件中的交替項
selecteditem          datagrid 控件中的選定項(由selectedindex設置,通過selecteditem屬性或者items[selectedindex]來讀取)
edititem          datagrid 控件中處于編輯狀態(tài)的項(由edititemindex設置,通過items[edititemindex]來讀取)
separator          datagrid 控件中項之間的分隔符
footer          datagrid 控件的腳注部分
pager              datagrid 控件的頁選擇節(jié)
注意,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都需要將目標控件轉(zhuǎn)換成相應的控件。
比如:
假設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[i].cells[j].controls[n]來獲取,然后轉(zhuǎn)換成原來的控件類型再操作,但是還有個更好的辦法,就是用findcontrol來查找控件。
findcontrol是system.web.ui.control的方法,可以根據(jù)子控件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后執(zhí)行的事件,執(zhí)行的事件取決于按鈕的commandname。其實最主要的一個是itemcommand,而后面四個都只是itemcommand的一小部分,
比如一個按鈕的commandname為"cancel",當返回后,首先執(zhí)行的是itemcommand事件,然后才是cancelcommand事件。

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

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


四、代碼片斷
1、datagrid顯示雙層表頭
假設你的datagrid有三列,現(xiàn)在想將前兩列作為"大類1",第三列作為"大類2",現(xiàn)在,你可以在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、設置綁定列或者自動生成列的編輯框?qū)挾?br>請在你的itemdatabound事件中加入一下代碼:
if (e.item.itemtype == listitemtype.edititem)
{
    for (int i = 0; i < e.item.cells.count; i++)
    {
        textbox txt = (textbox)e.item.cells[i].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中加入一個函數(shù)
protected void ddl_selectedindexchanged(object sender, system.eventargs e) //一定要聲明成protected或者public,不能是private的。
{
  //在這里就可以加入其他代碼
}

3.1、在上面的事件中怎樣得到本行其他cell的值呢?
我們知道,datagrid完全是一個table結(jié)構(gòu)的控件,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)
{
  //....
}


好了,暫時就寫到這里,不完善的地方請大家補充,有錯誤的地方請大家指正。

謹以此文,獻給所有熱愛技術、支持論壇發(fā)展的朋友
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 内乡县| 乌什县| 禹城市| 呼图壁县| 陈巴尔虎旗| 本溪市| 永年县| 辉县市| 获嘉县| 汾西县| 滁州市| 金乡县| 商城县| 淮安市| 芷江| 长寿区| 青岛市| 潞城市| 尖扎县| 柳江县| 保德县| 宜春市| 大邑县| 克东县| 柳州市| 云安县| 瑞昌市| 仁化县| 新河县| 元谋县| 贺州市| 滨州市| 乾安县| 阳城县| 临洮县| 永修县| 依兰县| 龙南县| 中牟县| 赣榆县| 托克托县|