前臺(tái)
<%[email protected] page language="c#" codebehind="webform5.aspx.cs" autoeventwireup="false" inherits="csdn.webform5" %>
<!doctype html public "-//w3c//dtd html 4.0 transitional//en" >
<html>
<head>
<title>webform5</title>
<meta content="microsoft visual studio .net 7.1" name="generator">
<meta content="c#" name="code_language">
<meta content="javascript" name="vs_defaultclientscript">
<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetschema">
</head>
<body>
<form id="form1" method="post" runat="server">
<asp:textbox id="textbox1" runat="server" width="88px"></asp:textbox>
<asp:textbox id="textbox2" runat="server" width="40px"></asp:textbox>
<asp:button id="button1" runat="server" text="添加"></asp:button>
<asp:datagrid id="datagrid1" runat="server" autogeneratecolumns="false" datakeyfield="id" allowpaging="true"
pagesize="5" oneditcommand="edit" oncancelcommand="cancel" onupdatecommand="update">
<columns>
<asp:templatecolumn headertext="姓名">
<itemtemplate>
<%...# databinder.eval(container.dataitem,"vname") %>
</itemtemplate>
<edititemtemplate>
<asp:textbox id="name" runat="server" text='<%# databinder.eval(container.dataitem,"vname") %>' width="88px">
</asp:textbox>
</edititemtemplate>
</asp:templatecolumn>
<asp:templatecolumn headertext="年齡">
<itemtemplate>
<%...# databinder.eval(container.dataitem,"iage") %>
</itemtemplate>
<edititemtemplate>
<asp:textbox id="age" runat="server" text='<%# databinder.eval(container.dataitem,"iage") %>' width="40px">
</asp:textbox>
</edititemtemplate>
</asp:templatecolumn>
<asp:editcommandcolumn updatetext="更新" canceltext="取消" edittext="編輯"></asp:editcommandcolumn>
<asp:buttoncolumn text="刪除" commandname="del"></asp:buttoncolumn>
</columns>
<pagerstyle mode="numericpages"></pagerstyle>
</asp:datagrid></form>
</body>
</html>
后臺(tái)
using system;
using system.collections;
using system.componentmodel;
using system.data;
using system.data.sqlclient;
using system.drawing;
using system.web;
using system.web.sessionstate;
using system.web.ui;
using system.web.ui.webcontrols;
using system.web.ui.htmlcontrols;
namespace csdn
...{
/**//// <summary>
/// webform5 的摘要說(shuō)明。
/// </summary>
public class webform5 : system.web.ui.page
...{
protected system.web.ui.webcontrols.textbox textbox1;
protected system.web.ui.webcontrols.textbox textbox2;
protected system.web.ui.webcontrols.button button1;
protected system.web.ui.webcontrols.datagrid datagrid1;
private void page_load(object sender, system.eventargs e)
...{
// 在此處放置用戶代碼以初始化頁(yè)面
if(!ispostback)
...{
setbind();
}
}
protected void setbind()
...{
sqlconnection conn=new sqlconnection(system.configuration.configurationsettings.appsettings["conn"]);
sqldataadapter da=new sqldataadapter("select * from tb1",conn);
dataset ds=new dataset();
da.fill(ds,"table1");
this.datagrid1.datasource=ds.tables["table1"];
this.datagrid1.databind();
}
web 窗體設(shè)計(jì)器生成的代碼#region web 窗體設(shè)計(jì)器生成的代碼
override protected void oninit(eventargs e)
...{
//
// codegen: 該調(diào)用是 asp.net web 窗體設(shè)計(jì)器所必需的。
//
initializecomponent();
base.oninit(e);
}
/**//// <summary>
/// 設(shè)計(jì)器支持所需的方法 - 不要使用代碼編輯器修改
/// 此方法的內(nèi)容。
/// </summary>
private void initializecomponent()
...{
this.button1.click += new system.eventhandler(this.button1_click);
this.datagrid1.itemcreated += new system.web.ui.webcontrols.datagriditemeventhandler(this.datagrid1_itemcreated);
this.datagrid1.itemcommand += new system.web.ui.webcontrols.datagridcommandeventhandler(this.datagrid1_itemcommand);
this.datagrid1.pageindexchanged += new system.web.ui.webcontrols.datagridpagechangedeventhandler(this.datagrid1_pageindexchanged);
this.load += new system.eventhandler(this.page_load);
}
#endregion
private void button1_click(object sender, system.eventargs e)
...{
sqlconnection conn=new sqlconnection(system.configuration.configurationsettings.appsettings["conn"]);
sqlcommand comm=new sqlcommand("insert into tb1 (vname,iage) values (@vname,@iage)",conn);
sqlparameter parm1=new sqlparameter("@vname",sqldbtype.nvarchar,50);
parm1.value=this.textbox1.text;
sqlparameter parm2=new sqlparameter("@iage",sqldbtype.int);
parm2.value=this.textbox2.text;
comm.parameters.add(parm1);
comm.parameters.add(parm2);
conn.open();
comm.executenonquery();
conn.close();
setbind();
}
private void datagrid1_itemcommand(object source, system.web.ui.webcontrols.datagridcommandeventargs e)
...{
if(e.commandname=="del")
...{
sqlconnection conn=new sqlconnection(system.configuration.configurationsettings.appsettings["conn"]);
sqlcommand comm=new sqlcommand("delete from tb1 where [email protected]",conn);
sqlparameter parm1=new sqlparameter("@id",sqldbtype.int);
parm1.value=this.datagrid1.datakeys[e.item.itemindex];
comm.parameters.add(parm1);
conn.open();
comm.executenonquery();
conn.close();
setbind();
}
}
private void datagrid1_pageindexchanged(object source, system.web.ui.webcontrols.datagridpagechangedeventargs e)
...{
this.datagrid1.currentpageindex=e.newpageindex;
setbind();
}
protected void edit(object sender,datagridcommandeventargs e)
...{
this.datagrid1.edititemindex=e.item.itemindex;
setbind();
}
protected void cancel(object sender,datagridcommandeventargs e)
...{
this.datagrid1.edititemindex=-1;
setbind();
}
protected void update(object sender,datagridcommandeventargs e)
...{
sqlconnection conn=new sqlconnection(system.configuration.configurationsettings.appsettings["conn"]);
sqlcommand comm=new sqlcommand("update tb1 set [email protected],[email protected] where [email protected]",conn);
sqlparameter parm1=new sqlparameter("@vname",sqldbtype.nvarchar,50);
parm1.value=((textbox)e.item.findcontrol("name")).text;
sqlparameter parm2=new sqlparameter("@iage",sqldbtype.int);
parm2.value=((textbox)e.item.findcontrol("age")).text;
sqlparameter parm3=new sqlparameter("@id",sqldbtype.int);
parm3.value=this.datagrid1.datakeys[e.item.itemindex];
comm.parameters.add(parm1);
comm.parameters.add(parm2);
comm.parameters.add(parm3);
conn.open();
comm.executenonquery();
conn.close();
this.datagrid1.edititemindex=-1;
setbind();
}
private void datagrid1_itemcreated(object sender, system.web.ui.webcontrols.datagriditemeventargs e)
...{
foreach(datagriditem di in this.datagrid1.items)
...{
if(di.itemtype==listitemtype.item||di.itemtype==listitemtype.alternatingitem||di.itemtype==listitemtype.edititem)
...{
((linkbutton)di.cells[3].controls[0]).attributes.add("onclick","return confirm('delete?');");
}
}
//一般不這么寫(xiě),看下面說(shuō)明第六點(diǎn)
}
}
(1)
大家可以看到setbind()中的一些代碼,并沒(méi)有顯式的打開(kāi)和關(guān)閉sqlconnection但是代碼確實(shí)是運(yùn)作的,原因在于sqldataadqpter的fill方法會(huì)自動(dòng)打開(kāi)或者關(guān)閉連接(當(dāng)然它會(huì)先檢測(cè)是不是連接已經(jīng)打開(kāi),如果已經(jīng)打開(kāi)的話不會(huì)重復(fù)打開(kāi)導(dǎo)致出錯(cuò))。
(2)
再看一下page_load()中
if(!ispostback)
{
setbind();
}
很多初學(xué)者,不理解ispostback盲目的加或者不加這句話,其實(shí)加不加在于你的需求
ispostback為真的時(shí)候表示網(wǎng)頁(yè)不是第一次加載也就是回傳的情況
只有在!ispostback為真的時(shí)候用了setbind();也就是綁定datagrid的關(guān)鍵在于我們需要修改記錄,這往往是很多網(wǎng)友在修改記錄的時(shí)候發(fā)現(xiàn)向數(shù)據(jù)庫(kù)寫(xiě)入的數(shù)據(jù)還是原來(lái)的textbox中的內(nèi)容。為什么會(huì)這樣呢?在修改的時(shí)候我們先按下“編輯”這個(gè)按鈕執(zhí)行了protected void edit(object sender,datagridcommandeventargs e)里面的代碼,在修改了textbox中數(shù)據(jù)以后我們按下“更新”這個(gè)按鈕,這個(gè)時(shí)候也是一次postback如果沒(méi)有if(!ispostback)的話,其中的綁定代碼執(zhí)行了一次,也就是對(duì)模板列中的textbox進(jìn)行了重新賦值,然后轉(zhuǎn)到protected void update(object sender,datagridcommandeventargs e)中的代碼,你的代碼是執(zhí)行的,但是((textbox)e.item.findcontrol("name")).text已經(jīng)不是你修改的東西而是原來(lái)的東西了。
(3)
修改的代碼中parm3.value=this.datagrid1.datakeys[e.item.itemindex]
對(duì)于e.item.itemindex就是點(diǎn)擊的這個(gè)行(事件觸發(fā)的行)的行好,如果要用這個(gè)作為主鍵來(lái)放進(jìn)where子句update或者delete顯然是不合適的,比如你點(diǎn)擊的是第三行,數(shù)據(jù)庫(kù)內(nèi)這個(gè)記錄的主鍵卻是20或者是字符,因此我們需要為datagrid指定一個(gè)datakeyfield(前臺(tái)代碼中)告訴它,我的表的主鍵就是這個(gè)字段,在綁定了以后datagrid的datakeys就存儲(chǔ)數(shù)據(jù)了列表控件中每個(gè)記錄的主鍵,所以取的時(shí)候用索引this.datagrid1.datakeys[e.item.itemindex]來(lái)取就可以得到主鍵
(4)
看一下private void datagrid1_itemcreated(object sender, system.web.ui.webcontrols.datagriditemeventargs e)
中的一些代碼,首先itemcreated這個(gè)事件是在當(dāng)在datagrid控件中創(chuàng)建項(xiàng)時(shí)在服務(wù)器上發(fā)生,這個(gè)時(shí)候還沒(méi)有綁定數(shù)據(jù),所以如果在這個(gè)itemcreated中去取datagrid中的值你是得不到的。
foreach(datagriditem di in this.datagrid1.items)
{
if(di.itemtype==listitemtype.item||di.itemtype==listitemtype.alternatingitem||di.itemtype==listitemtype.edititem)
{
((linkbutton)di.cells[3].controls[0]).attributes.add("onclick","return confirm('delete?');");//這里的類(lèi)型轉(zhuǎn)換為linkbutton,在不指定buttoncolumn 的buttontype的時(shí)候默認(rèn)就是linkbutton,如果指定為pushbutton,這里類(lèi)型轉(zhuǎn)換應(yīng)該寫(xiě)button而不是linkbutton否則會(huì)出錯(cuò)
}
}
這段代碼為所有的刪除按鈕增加客戶端的click事件,在循環(huán)所有的datagrid1.items的時(shí)候我們注意到,僅僅需要在listitemtype.item和listitemtype.alternatingitem中的第四列(cells[3])中的第一個(gè)按鈕控件(controls[0])上添加屬性,因?yàn)樵赿atagrid的header或者footer中是找不到這個(gè)刪除按鈕的(雖然他們也是datagrid1.items)。設(shè)想一下如果不寫(xiě)di.itemtype==listitemtype.edititem會(huì)怎么樣?結(jié)果就是在編輯的時(shí)候按刪除那個(gè)時(shí)候是沒(méi)有提示的,因?yàn)闆](méi)有給編輯的行的按鈕加腳本。說(shuō)到這里想說(shuō)一下對(duì)這個(gè)程序的改進(jìn),大家或許不想在編輯的時(shí)候允許刪除操作(也就是點(diǎn)擊了編輯按鈕卻沒(méi)有點(diǎn)擊取消或者更新按鈕的時(shí)候是不運(yùn)行刪除操作),改進(jìn)方法很簡(jiǎn)單:把e.commandname=="del"這個(gè)判斷改為e.commandname=="del"&&e.item.itemtype!=listitemtype.edititem,就可以達(dá)到這個(gè)目的了。
還有之所以在這里沒(méi)有用((linkbutton)di.cells[3].findcontrol(刪除按鈕的id))來(lái)找到這個(gè)按鈕是因?yàn)檫@個(gè)按鈕如果不寫(xiě)是 <asp:buttoncolumn text="刪除" commandname="del"></asp:buttoncolumn>不能添加id的,如果這個(gè)按鈕是放在模板列中的,就可以有id了。
(5)
在編輯的時(shí)候this.datagrid1.edititemindex=e.item.itemindex在取消編輯的時(shí)候this.datagrid1.edititemindex=-1
當(dāng)edititemindex!=-1的時(shí)候,datagrid顯示的東西不再是itemtemplate中的東西而是edititemtemplate中的東西,所以在取消編輯的時(shí)候設(shè)定-1就可以了,同樣edititemindex和itemindex差不多是從0開(kāi)始編號(hào),表示的是編輯的這一行的索引號(hào)。
(6)
foreach(datagriditem di in this.datagrid1.items)
{
if(di.itemtype==listitemtype.item||di.itemtype==listitemtype.alternatingitem||di.itemtype==listitemtype.edititem)
{
((linkbutton)di.cells[3].controls[0]).attributes.add("onclick","return confirm('delete?');");
}
}
}
這段代碼我為了演示如果不對(duì)itemtype進(jìn)行判斷會(huì)出錯(cuò),所以對(duì)datagrid1.items進(jìn)行了循環(huán)讀取(可以通過(guò)調(diào)試看到當(dāng)在設(shè)置了footer以后datagrid1.items.count>pagesize),一般情況下這么寫(xiě)就可以了
if(e.item.itemtype==listitemtype.item||e.item.itemtype==listitemtype.alternatingitem||e.item.itemtype==listitemtype.edititem)
{
((linkbutton)e.item.cells[3].controls[0]).attributes.add("onclick","return confirm('delete?');");
}