前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
>
![None.gif](/Images/OutliningIndicators/None.gif)
<
Columns
>
![None.gif](/Images/OutliningIndicators/None.gif)
<
asp:TemplateColumn HeaderText
=
"
姓名
"
>
<
HeaderStyle Width
=
"
100px
"
></
HeaderStyle
>
<
ItemTemplate
>
<
asp:label ID
=
"
username
"
Text
=
'
<%# DataBinder.Eval(Container.DataItem, "username").ToString() %> ' Runat="server" />
</
ItemTemplate
>
</
asp:TemplateColumn
>
![None.gif](/Images/OutliningIndicators/None.gif)
<
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
>
![None.gif](/Images/OutliningIndicators/None.gif)
<
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
>
![None.gif](/Images/OutliningIndicators/None.gif)
<
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
>
![None.gif](/Images/OutliningIndicators/None.gif)
<
asp:EditCommandColumn ButtonType
=
"
LinkButton
"
UpdateText
=
"
update
"
HeaderText
=
"
編辑
"
CancelText
=
"
cancel"
EditText
=
"
edit
"
>
</
asp:EditCommandColumn
>
</
Columns
>
</
asp:datagrid
>
最初的页面显示如下:
按下编辑后的页面:
对于编辑列中的edit,update,cancel需要用到下面的是件:
'
=========================================
'
During in-line-editing mode this selects corresponding items for dropdowns and text boxes.
'
==========================================
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
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))
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
End If
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
End Sub
'
编写从 DropDownList 中检索当前选定值的代码,并执行数据库更新
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
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
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
End Sub
'
我们的取消事件是把当前所选行号设为-1. 这样就等于告诉datagrid, 不在是编辑模式了. 然后, 我们重新绑定数据.
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
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