【问题标题】:Populating a dropdownlist in the rowEditing event of a GridView在 GridView 的 rowEditing 事件中填充下拉列表
【发布时间】:2013-12-10 13:55:25
【问题描述】:

我有一个如下的 GridView

<asp:GridView ID="gvChain" runat="server" Font-Size="Small" CellPadding="3" CellSpacing="1" GridLines="None" AutoGenerateColumns="False">
  <headerstyle backcolor="#CCCCCC" />
  <columns>
  <asp:BoundField DataField="Department" HeaderText="Department" />
  <asp:TemplateField HeaderText="Manager Level 1">
    <ItemTemplate>
      <asp:Label ID="lblManager1" runat="server" Text=""></asp:Label>
    </ItemTemplate>
    <EditItemTemplate>
      <asp:DropDownList ID="cbManager1" runat="server"/>
    </EditItemTemplate>
  </asp:TemplateField>
  <asp:TemplateField HeaderText="Manager Level 2">
    <ItemTemplate>
      <asp:Label ID="lblManager2" runat="server"/>
    </ItemTemplate>
    <EditItemTemplate>
      <asp:DropDownList ID="cbManager2" runat="server"/>
    </EditItemTemplate>
    </asp:TemplateField>
    <asp:CommandField ShowEditButton="True">
      <ControlStyle ForeColor="#009EDD" />
    </asp:CommandField>
  </columns>
</asp:GridView>

BoundField 'Department' 被填充到 Page_Load 中,如下所示,它工作正常并使用部门列表填充 GridView。

Dim dhandler As DepartmentHandler = New DepartmentHandler
Dim depts As New List(Of Department)

depts = dhandler.GetDepartmentList

gvChain.DataSource = depts
gvChain.DataBind()

然后我在 RowDAtaBound 事件中填充 TemplateFields 的 ItemTemplates,如下所示。这也很好用。

If e.Row.RowType = DataControlRowType.DataRow Then
  Dim lblManager1 As Label = DirectCast(e.Row.FindControl("lblManager1"), Label)
  Dim lblManager2 As Label = DirectCast(e.Row.FindControl("lblManager2"), Label)

  Dim eHandler As EmployeeHandler = New EmployeeHandler
  Dim deptCell As TableCell = e.Row.Cells(0)
  Dim dept As Department = New Department
  dept.Department = deptCell.Text
  Dim mgr1 As Manager = eHandler.getManager1(dept)
  Dim mgr2 As Manager = eHandler.getManager2(dept)

  lblManager1.Text = mgr1.Name
  lblManager2.Text = mgr2.Name
End If

我现在想要实现的是,当单击 GridView 上一行的“编辑”字段时,使用管理器列表填充 cbManager1 和 cbManager2,并将每个 DDL 的 SelectedValue 设置为与我检索时相同的值项目模板。我可以在 GridView 的 RowEditing 事件中使用以下代码获取数据:

' Get the list of managers
Dim mgrs As New List(Of Manager)
mgrs = eHandler.GetManagerList

' Get the department name from the BoundField
Dim deptCell As TableCell = gvChain.Rows(e.NewEditIndex).Cells(0)
Dim dept As Department = New Department
dept.Department = deptCell.Text

' Pass the department name to the getManager1/2 functions to return the correct manager for that department
Dim mgr1 As Manager = eHandler.getManager1(dept)
Dim mgr2 As Manager = eHandler.getManager2(dept)

我设置了断点来检查从函数返回的数据,并且数据按预期存在,但我卡住的地方是在 EditItemTemplate 中获取 DDL 的引用,以便我可以对它们进行数据绑定并设置 SelectedValue。

我尝试了以下方法,但这给出了 NullReference 异常:

Dim cbManager1 As DropDownList = TryCast(gvChain.Rows(e.NewEditIndex).FindControl("cbManager1"), DropDownList)
Dim cbManager2 As DropDownList = TryCast(gvChain.Rows(e.NewEditIndex).FindControl("cbManager2"), DropDownList)

【问题讨论】:

标签: asp.net vb.net gridview


【解决方案1】:

我最终解决了这个问题。我在 RowEditing 事件中添加了以下代码

gvChain.EditIndex = e.NewEditIndex
gvChain.DataBind()

然后我在 RowDataBound 事件中做了以下操作

If e.Row.RowState = DataControlRowState.Edit Then
  Dim cbManager1 As DropDownList = TryCast(e.Row.FindControl("cbManager1"), DropDownList)
  Dim cbManager2 As DropDownList = TryCast(e.Row.FindControl("cbManager2"), DropDownList)

  Dim eHandler As EmployeeHandler = New EmployeeHandler

  Dim mgrs As New List(Of Manager)
  mgrs = eHandler.GetManagerList
  cbManager1.DataSource = mgrs
  cbManager2.DataSource = mgrs
  cbManager1.DataValueField = "Name"
  cbManager1.DataTextField = "Name"
  cbManager2.DataValueField = "Name"
  cbManager2.DataValueField = "Name"
  cbManager1.DataBind()
  cbManager2.DataBind()

  ' Got rid of the bound field in the end and did it with a templatefield so needed to get the department from the label
  Dim lbl As Label = e.Row.Cells(0).FindControl("lblDepartment")
  Dim dept As Department = New Department
  dept.Department = lbl.Text

  Dim mgr1 As Manager = eHandler.getManager1(dept)
  Dim mgr2 As Manager = eHandler.getManager2(dept)

  Dim mgr1Name As String = mgr1.Name.ToUpper()
  Dim mgr2Name As String = mgr2.Name.ToUpper()

  cbManager1.SelectedValue = mgr1Name
  cbManager2.SelectedValue = mgr2Name
End If

【讨论】:

    【解决方案2】:

    你可以试试这样的

    If e.Row.RowState = DataControlRowState.Edit Then    
       Dim cbmanager As DropDownList = e.Row.FindControl("cbmanager1")    
       If Not cbmanager Is Nothing Then cbmanager.Items.Add(New ListItem("Test1", "Test1"))       
    End If
    

    【讨论】:

    • 这在 RowEditing 事件中不起作用。我一直在做更多的研究,似乎我在叫错树。 RowEditing 事件发生在单击编辑按钮但在 GridView 进入编辑模式之前。由于我的 DDL 在 EditItemTemplate 中,因此在尝试在 RowEditing 事件中引用它们时它们还不存在。我需要完全不同的方法。我想我需要让我的 GridView 进入编辑模式,而不是按照您在 RowDataBound 事件中的建议进行操作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 2017-11-26
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多