前2天我做的财务管理系统中需要用到datagrid控件来显示用户信息,为了能够编辑用户信息,我参照微软的asp.net入门套件ASP.NET Time Tracker Starter Kit (VBVS)中在datagrid中使用编辑模版。 在问题没解决之前,点击datagrid中的编辑始终报下面错误:
’==================
‘===================
下面是datagrid的html文件:
<
asp:datagrid id
=
"
dguserdetail
"
runat
=
"
server
"
CssClass
=
"
datagrid
"
Width
=
"
760
"
AlternatingItemStyle
-
BackColor
=
"
#F9F9F9"
AllowPaging = " true " CellPadding = " 3 " PageSize = " 15 " AutoGenerateColumns = " false " EnableViewState = " true " OnUpdateCommand = " dguserdetail_UpdateCommand " OnEditCommand = " dguserdetail_OnEdit " OnCancelCommand = " dguserdetail_OnCancel " >
< AlternatingItemStyle BackColor = " #F9F9F9 " ></ AlternatingItemStyle >
< HeaderStyle Font - Bold = " True " ></ HeaderStyle >
< Columns >
< asp:TemplateColumn HeaderText = " 姓名 " >
< HeaderStyle Width = " 100px " ></ HeaderStyle >
< ItemTemplate >
< asp:label ID = " username " Text = ' <%# DataBinder.Eval(Container.DataItem, "username").ToString() %> ' Runat="server" />
</ ItemTemplate >
</ asp:TemplateColumn >
< asp:TemplateColumn HeaderText = " 密码 " >
< ItemStyle Wrap = " False " ></ ItemStyle >
< ItemTemplate >
< asp:label ID = " password " Text = ' <%# DataBinder.Eval(Container.DataItem, "password").ToString() %> ' Runat="server" />
</ ItemTemplate >
< EditItemTemplate >
< asp:textbox runat = " server " CssClass = " Standard-text " ID = " txtpassword " Text = ' <%#DataBinder.Eval(Container.DataItem, "password").ToString()%>' Width="100" MaxLength="255">
</ asp:textbox >
</ EditItemTemplate >
</ asp:TemplateColumn >
< asp:TemplateColumn HeaderText = " 电子邮箱 " >
< ItemTemplate >
< asp:label ID = " email " Text = ' <%# DataBinder.Eval(Container.DataItem, "email").ToString() %> ' Runat="server" />
</ ItemTemplate >
< EditItemTemplate >
< asp:textbox Width = " 135px " AutoPostBack = false CssClass = " Standard-text " Runat = " server " ID = " txtemail " Text = ' <%# DataBinder.Eval(Container.DataItem, "email").ToString() %> ' />
< asp:regularexpressionvalidator id = " RegularExpressionValidator1 " runat = " server " ErrorMessage = " 电子邮件无效 " ControlToValidate = " txtemail"
ValidationExpression = " \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* " ></ asp:regularexpressionvalidator >
</ EditItemTemplate >
</ asp:TemplateColumn >
< asp:TemplateColumn HeaderText = " 权限 " >
< ItemStyle Wrap = " False " ></ ItemStyle >
< ItemTemplate >
< asp:label ID = " authority " Text = ' <%# DataBinder.Eval(Container, "DataItem.authority") %>' Runat="server" />
</ ItemTemplate >
< edititemtemplate >
< asp:dropdownlist Width = " 100px " ID = " DDauthority " DataSource = ' <%# bindDropDownList %>' Runat="server">
</ asp:dropdownlist >
</ edititemtemplate >
</ asp:TemplateColumn >
< asp:EditCommandColumn ButtonType = " LinkButton " UpdateText = " update " HeaderText = " 編辑 " CancelText = " cancel"
EditText = " edit " >
</ asp:EditCommandColumn >
</ Columns >
</ asp:datagrid >
AllowPaging = " true " CellPadding = " 3 " PageSize = " 15 " AutoGenerateColumns = " false " EnableViewState = " true " OnUpdateCommand = " dguserdetail_UpdateCommand " OnEditCommand = " dguserdetail_OnEdit " OnCancelCommand = " dguserdetail_OnCancel " >
< AlternatingItemStyle BackColor = " #F9F9F9 " ></ AlternatingItemStyle >
< HeaderStyle Font - Bold = " True " ></ HeaderStyle >
< Columns >
< asp:TemplateColumn HeaderText = " 姓名 " >
< HeaderStyle Width = " 100px " ></ HeaderStyle >
< ItemTemplate >
< asp:label ID = " username " Text = ' <%# DataBinder.Eval(Container.DataItem, "username").ToString() %> ' Runat="server" />
</ ItemTemplate >
</ asp:TemplateColumn >
< asp:TemplateColumn HeaderText = " 密码 " >
< ItemStyle Wrap = " False " ></ ItemStyle >
< ItemTemplate >
< asp:label ID = " password " Text = ' <%# DataBinder.Eval(Container.DataItem, "password").ToString() %> ' Runat="server" />
</ ItemTemplate >
< EditItemTemplate >
< asp:textbox runat = " server " CssClass = " Standard-text " ID = " txtpassword " Text = ' <%#DataBinder.Eval(Container.DataItem, "password").ToString()%>' Width="100" MaxLength="255">
</ asp:textbox >
</ EditItemTemplate >
</ asp:TemplateColumn >
< asp:TemplateColumn HeaderText = " 电子邮箱 " >
< ItemTemplate >
< asp:label ID = " email " Text = ' <%# DataBinder.Eval(Container.DataItem, "email").ToString() %> ' Runat="server" />
</ ItemTemplate >
< EditItemTemplate >
< asp:textbox Width = " 135px " AutoPostBack = false CssClass = " Standard-text " Runat = " server " ID = " txtemail " Text = ' <%# DataBinder.Eval(Container.DataItem, "email").ToString() %> ' />
< asp:regularexpressionvalidator id = " RegularExpressionValidator1 " runat = " server " ErrorMessage = " 电子邮件无效 " ControlToValidate = " txtemail"
ValidationExpression = " \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* " ></ asp:regularexpressionvalidator >
</ EditItemTemplate >
</ asp:TemplateColumn >
< asp:TemplateColumn HeaderText = " 权限 " >
< ItemStyle Wrap = " False " ></ ItemStyle >
< ItemTemplate >
< asp:label ID = " authority " Text = ' <%# DataBinder.Eval(Container, "DataItem.authority") %>' Runat="server" />
</ ItemTemplate >
< edititemtemplate >
< asp:dropdownlist Width = " 100px " ID = " DDauthority " DataSource = ' <%# bindDropDownList %>' Runat="server">
</ asp:dropdownlist >
</ edititemtemplate >
</ asp:TemplateColumn >
< asp:EditCommandColumn ButtonType = " LinkButton " UpdateText = " update " HeaderText = " 編辑 " CancelText = " cancel"
EditText = " edit " >
</ asp:EditCommandColumn >
</ Columns >
</ asp:datagrid >
最初的页面显示如下:
按下编辑后的页面:
对于编辑列中的edit,update,cancel需要用到下面的是件:
Protected
Sub dguserdetail_OnEdit()
Sub dguserdetail_OnEdit(ByVal sender As [Object], ByVal e As DataGridCommandEventArgs) Handles dguserdetail.EditCommand
'==============================
dguserdetail.EditItemIndex = e.Item.ItemIndex //'获取被选中的行索引
'Saves current info on temporary, use later in dguserdetail_Itembound()
studatagrid.username = CType(e.Item.FindControl("username"), Label).Text.Trim
studatagrid.password = CType(e.Item.FindControl("password"), Label).Text.Trim
studatagrid.email = CType(e.Item.FindControl("email"), Label).Text.Trim
studatagrid.authority = CType(e.Item.FindControl("authority"), Label).Text.Trim
'=======================================
SetBind() //'最后问题解决的关键语句
'=======================================
'==============================
dguserdetail.EditItemIndex = e.Item.ItemIndex //'获取被选中的行索引
'Saves current info on temporary, use later in dguserdetail_Itembound()
studatagrid.username = CType(e.Item.FindControl("username"), Label).Text.Trim
studatagrid.password = CType(e.Item.FindControl("password"), Label).Text.Trim
studatagrid.email = CType(e.Item.FindControl("email"), Label).Text.Trim
studatagrid.authority = CType(e.Item.FindControl("authority"), Label).Text.Trim
'=======================================
SetBind() //'最后问题解决的关键语句
'=======================================
'
=========================================
' During in-line-editing mode this selects corresponding items for dropdowns and text boxes.
' ==========================================
Private Sub ItemDataBound() Sub ItemDataBound(ByVal sender As Object, _
ByVal e As DataGridItemEventArgs) Handles dguserdetail.ItemDataBound
If e.Item.ItemType = ListItemType.EditItem Then
Dim currentCbo As DropDownList = CType(e.Item.FindControl("DDauthority"), DropDownList)
currentCbo.SelectedIndex = currentCbo.Items.IndexOf(currentCbo.Items.FindByText(studatagrid.authority))
End If
End Sub
' During in-line-editing mode this selects corresponding items for dropdowns and text boxes.
' ==========================================
Private Sub ItemDataBound() Sub ItemDataBound(ByVal sender As Object, _
ByVal e As DataGridItemEventArgs) Handles dguserdetail.ItemDataBound
If e.Item.ItemType = ListItemType.EditItem Then
Dim currentCbo As DropDownList = CType(e.Item.FindControl("DDauthority"), DropDownList)
currentCbo.SelectedIndex = currentCbo.Items.IndexOf(currentCbo.Items.FindByText(studatagrid.authority))
End If
End Sub
'
编写从 DropDownList 中检索当前选定值的代码,并执行数据库更新
Protected Sub dguserdetail_UpdateCommand() Sub dguserdetail_UpdateCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles dguserdetail.UpdateCommand
Dim item As DataGridItem = dguserdetail.Items(dguserdetail.EditItemIndex)
If e.CommandName = "Update" Then
If e.Item.ItemType = ListItemType.EditItem Then '只有在编辑按下以后才能提交
Dim username As String
Dim password As String
Dim email As String
Dim authority As String
Dim authorityId As Integer
username = CType(e.Item.FindControl("username"), Label).Text
password = CType(e.Item.FindControl("txtpassword"), TextBox).Text
email = CType(e.Item.FindControl("txtemail"), TextBox).Text
authority = CType(e.Item.FindControl("ddauthority"), DropDownList).SelectedItem.Value
authorityId = IIf(authority = "系统管理员", 1, 0)
' Save the dguserdetail object.
Try
SqlHelper.ExecuteNonQuery(strconn, "updateuser", username, password, email, authorityId)
Catch
End Try
End If
' Quit in-line-editing mode.
dguserdetail.EditItemIndex = -1
SetBind()
End If
End Sub
Protected Sub dguserdetail_UpdateCommand() Sub dguserdetail_UpdateCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles dguserdetail.UpdateCommand
Dim item As DataGridItem = dguserdetail.Items(dguserdetail.EditItemIndex)
If e.CommandName = "Update" Then
If e.Item.ItemType = ListItemType.EditItem Then '只有在编辑按下以后才能提交
Dim username As String
Dim password As String
Dim email As String
Dim authority As String
Dim authorityId As Integer
username = CType(e.Item.FindControl("username"), Label).Text
password = CType(e.Item.FindControl("txtpassword"), TextBox).Text
email = CType(e.Item.FindControl("txtemail"), TextBox).Text
authority = CType(e.Item.FindControl("ddauthority"), DropDownList).SelectedItem.Value
authorityId = IIf(authority = "系统管理员", 1, 0)
' Save the dguserdetail object.
Try
SqlHelper.ExecuteNonQuery(strconn, "updateuser", username, password, email, authorityId)
Catch
End Try
End If
' Quit in-line-editing mode.
dguserdetail.EditItemIndex = -1
SetBind()
End If
End Sub
'
我们的取消事件是把当前所选行号设为-1. 这样就等于告诉datagrid, 不在是编辑模式了. 然后, 我们重新绑定数据.
Protected Sub dguserdetail_OnCancel() Sub dguserdetail_OnCancel(ByVal sender As [Object], ByVal e As DataGridCommandEventArgs) Handles dguserdetail.CancelCommand
dguserdetail.EditItemIndex = -1
SetBind()
End Sub ' TimeEntryGrid_OnCancel
Protected Sub dguserdetail_OnCancel() Sub dguserdetail_OnCancel(ByVal sender As [Object], ByVal e As DataGridCommandEventArgs) Handles dguserdetail.CancelCommand
dguserdetail.EditItemIndex = -1
SetBind()
End Sub ' TimeEntryGrid_OnCancel