datagrid中使用dropdownlist编辑模版时遇到问题
前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(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(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(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(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(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(ByVal sender As [Object], ByVal e As DataGridCommandEventArgs) Handles dguserdetail.CancelCommand
dguserdetail.EditItemIndex = -1
SetBind()
End Sub 'TimeEntryGrid_OnCancel
Protected Sub dguserdetail_OnCancel(ByVal sender As [Object], ByVal e As DataGridCommandEventArgs) Handles dguserdetail.CancelCommand
dguserdetail.EditItemIndex = -1
SetBind()
End Sub 'TimeEntryGrid_OnCancel