使用命令列有兩種方式:
1.在“可選列”中添加相應的CommandField列的子項
2.在“可選列”中添加CommandField列,然后設置CommandField列的屬性ShowEditButton、ShowDeleteButton等
一旦添加了命令按鈕,我們就可以對GridView實現(xiàn)簡單的修改和更新的操作了。但是如果要想實現(xiàn)刪除操作的話還不行,還需要為GridView設置一個DataKeyNames屬性。如果不設置此屬性的話編譯是沒問題的,但運行時會產(chǎn)生“未提供參數(shù)”的異常,這一點切記。
DataKeyNames屬性用來設置GridView對應的數(shù)據(jù)源的主鍵列,只有設置這個屬性,在刪除的時候才會把要刪除的主鍵值傳遞給DataSource控件執(zhí)行刪除功能。
我們一起來看一下運行結(jié)果所存在的問題:
1.主鍵列Code不應當被編輯
2.GridView自動產(chǎn)生的文本框太寬,把我們的GridView都給擠變形了。
3.民族列在瀏覽時一直都顯示民族代號,應當顯示民族名稱
4.民族列在修改的時候最好使用下拉列表讓用戶選擇相應的民族。
5.文本輸入框沒有任何驗證,對輸錯的信息在提交的時候會產(chǎn)生異常
6.刪除時沒有確認提示
7.刪除時產(chǎn)生外鍵引用的異常
這里的問題實在是太多了,有的問題很簡單就可以解決,但有的問題我們借助后面的模板列會更簡單一些。
1、防止某列被編輯,只需要在“編輯列”對應框中將該列的ReadOnly屬性設為true就可以了。
2、代碼控制編輯狀態(tài)下文本框的寬度(這種方式有點復雜,可以用模板列實現(xiàn))
我們上面已經(jīng)分析過GridView每一行的建造過程了,它包含“創(chuàng)建行”和“綁定行”兩步操作,“創(chuàng)建行”的過程中會把一些靜態(tài)的東西創(chuàng)建出來,當然也包含文本框的創(chuàng)建。因此我們只需要在RowCreated事件中把編輯列中的文本框的長度改變一下就可以了。
protected void GridView1_RowCreated(objectsender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
//這里可能是VS2005的一個Bug,所以我只好把整型強制轉(zhuǎn)為DataControlRowState枚舉類型再與e.Row.RowState屬性進行比較
//4-Normal行的編輯狀態(tài),5-Alternating行處于編輯狀態(tài)
if (e.Row.RowState ==(DataControlRowState)4||e.Row.RowState==(DataControlRowState)5)
{
//Width屬性是Unit類型,不能直接賦整型值
//Unit.Pixel():按像素設置絕對寬度;Unit.Percent():按百分比設置寬度
((TextBox)e.Row.Cells[1].Controls[0]).Width =Unit.Pixel(60);
((TextBox)e.Row.Cells[3].Controls[0]).Width = Unit.Pixel(60);
((TextBox)e.Row.Cells[4].Controls[0]).Width =Unit.Pixel(100);
}
}
}
3.瀏覽狀態(tài)時顯示民族名稱,只需要將實體中添加一個只讀屬性NationName,然后用它替換Nation字段,綁定到GridView就可以了。
4.對主表中的數(shù)據(jù)刪除時級聯(lián)刪除相關子表數(shù)據(jù)
這種問題用很多種實現(xiàn)方式:
a.使用數(shù)據(jù)庫中外鍵的級聯(lián)刪除功能
b.使用存儲過程或觸發(fā)器。
c.在程序代碼中刪除
前兩種方式實現(xiàn)方式主要是數(shù)據(jù)庫方面的知識,這里不多說了,下面我們主要看看如何使用程序代碼刪除數(shù)據(jù)。
當我們點擊刪除按鈕的時候,GridView會自動把要刪除的行對象傳遞給DataSource控件,然后DataSource調(diào)用相關的業(yè)務類的方法執(zhí)行刪除,再然后就發(fā)生“外鍵引用異常”......
整個這個過程是系統(tǒng)自動完成的,那我們要想自己寫代碼進行級聯(lián)刪除,并且禁止系統(tǒng)自動調(diào)用默認的刪除功能,那如何實現(xiàn)呢?
大家會注意到其中的事件大部分都有兩類:***ed和***ing兩類。如:Deleted和Deleting事件
***ed事件:系統(tǒng)執(zhí)先完操作后觸發(fā),如Deleted事件是系統(tǒng)調(diào)用默認刪除功能,刪除成功后自動觸發(fā)
***ing事件:系統(tǒng)執(zhí)行操作之前觸發(fā),如Deleting事件是系統(tǒng)調(diào)用默認刪除功能之前觸發(fā)。
現(xiàn)在大家應當清楚在點擊刪除按鈕后如何添加自己的刪除處理程序了,答案當然是應當在Deleting中編寫代碼進行級聯(lián)刪除。
主要代碼如下:
protected void GridView1_RowDeleting(object sender,GridViewDeleteEventArgs e)
{
//取得要刪除行的主鍵的值
string str =GridView1.DataKeys[e.RowIndex].Value.ToString();
//使用事務
using (TransactionScope ts = newTransactionScope())
{
//刪除該主鍵值在刪除簡歷表中對應的數(shù)據(jù)
new WorkDA().deleteInfo(str);
//刪除該主鍵值在刪除家庭關系表中對應的數(shù)據(jù)
new FamilyDA().deleteInfo(str);
//刪除該主鍵值在基本信息表中對應的數(shù)據(jù)
new InfoDA().delete(str);
//提交事務
ts.Complete();
}
//取銷事件進一步響影,即該刪除操作不再往上提交至DataSource控件。