有兩種作法:
(1)加入CommandField
(2)加入TemplateField
重點:從一般模式進入Edit要指定EditIndex,而且要執行DataBind()才會進入編輯模式(顯示TextBox)!!如果是用後端餵DataSource的方式,要記得再餵一次!!!
作法大致如下:
(1)加入CommandField
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:CommandField ShowEditButton="True" ShowDeleteButton="True"/>
<asp:BoundField DataField="ProgramName" HeaderText="ProgramName"/>
<asp:BoundField DataField="iconid" HeaderText="iconid"/>
<asp:BoundField DataField="classid" HeaderText="classid"/>
</Columns>
</asp:GridView>
後端要處理GridView的RowEditing、RowCancelingEdit、RowDeleting、RowUpdating等事件
例如:
Protected Sub GridView1_RowEditing(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewEditEventArgs) Handles GridView1.RowEditing
'指定哪列資料進入EditMode
Me.GridView1.EditIndex = e.NewEditIndex
'宣告一個執行Query DB的 object(自訂class)
Dim DataObjUtil As New DataObjectUtility()
Me.GridView1.DataSource = DataObjUtil.GetDataTable("select programname,iconid,classid from tb_functionmenu", Me.Page)
'完成Bind才會讓該列進入EditMode!
Me.GridView1.DataBind()
End Sub
(2)加入TemplateField
<asp:GridView ID="GrvSPCKC" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:TemplateField>
<EditItemTemplate>
<asp:Button ID="BtnUpdate" runat="server" Text="更新" CommandName="UpdateRow" CommandArgument="<%# CType(Container,GridViewRow).RowIndex %>" />
<asp:Button ID="BtnCancel" runat="server" Text="取消" CommandName="CancelRow" CommandArgument="<%# CType(Container,GridViewRow).RowIndex %>" OnClientClick="return confirm('確定放棄編輯?');" />
</EditItemTemplate>
<ItemTemplate>
<asp:Button ID="BtnEdit" runat="server" Text="修改" CommandName="EditRow" CommandArgument="<%# CType(Container,GridViewRow).RowIndex %>" />
<asp:Button ID="BtnDel" runat="server" Text="刪除" CommandName="DelRow" CommandArgument="<%# CType(Container,GridViewRow).RowIndex %>" OnClientClick="return confirm('確定刪除?');" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField HeaderText="DFCD" DataField="dfcd" />
<asp:BoundField HeaderText="RVNO" DataField="rvno" />
</Columns>
</asp:GridView>
CommandName目的是為了待會處理RowCommand事件時辨別是Edit、Delete or Cancel
CommandArgument則是為了要知道哪列資料要修改或刪除
後端程式碼則只要處理RowCommand事件
如下:
Protected Sub GrvSPCKC_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles GrvSPCKC.RowCommand
'讀取傳入的列編號
Dim TrigerRowIndex As Integer = Convert.ToInt32(e.CommandArgument)
'根據CommandName參數呼叫各別函式處理
Select Case e.CommandName
Case "EditRow"
Me.ChangeToEditMode(TrigerRowIndex)
Case "CancelRow"
Me.CancelEditRow()
Case "DelRow"
Me.DeleteRow(TrigerRowIndex)
Case "UpdateRow"
Me.UpdateRow(TrigerRowIndex)
End Select
End Sub
事實上,
方法(1)使用CommandField也是會觸發RowCommand事件
只不過我們忽略他而已
而且RowCommand事件會比RowEditing、RowCancelingEdit..等事件先被觸發!
沒有留言:
張貼留言