Asp.net 在GridView的行编辑事件中填充dropdownlist

Asp.net 在GridView的行编辑事件中填充dropdownlist,asp.net,vb.net,gridview,Asp.net,Vb.net,Gridview,我有一个网格视图如下 <asp:GridView ID="gvChain" runat="server" Font-Size="Small" CellPadding="3" CellSpacing="1" GridLines="None" AutoGenerateColumns="False"> <headerstyle backcol

我有一个网格视图如下

<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>
然后在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上某行的“编辑”字段时,使用管理器列表填充CBManager 1和CBManager 2,并将每个DDL的SelectedValue设置为与我在项目模板中检索的值相同的值。我可以在GridView的行编辑事件中使用以下代码获取数据:

' 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)

你可以试试这样的

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事件添加了以下代码

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

你在哪里试最后两个句子我是说在哪种情况下?对不起,他们在同一排event@Jimsan-您应该选中此项:。这在行编辑事件中不起作用。我一直在做更多的研究,看来我找错了方向。单击“编辑”按钮但在GridView进入编辑模式之前发生RowEditing事件。由于我的DDL位于EditItemTemplate中,因此在RowEditing事件中尝试引用它们时,它们还不存在。我需要一个完全不同的方法。我想我需要让GridView进入编辑模式,而不是按照您在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