ASP.NET Visual Basic 代码隐藏.. 试图填充驻留在 formview 中的下拉列表

ASP.NET Visual Basic Code Behind.. Trying to populate a dropdownlist that resides in formview

我想在这里为我的项目寻求一点帮助。 在我的代码中,我有两个下拉列表。第一个列表在页面加载时填充来自 LDAP 查询的结果。因此下拉列表效果很好,并向用户显示 AD 中的活动用户列表。

现在让我头疼的是... 我的项目中有一个 formview 控件。我在 edititem 模板中放置了一个额外的下拉列表。我想要做的是将第一个下拉列表的内容复制到第二个下拉列表中。我遇到的问题是,当我尝试为第二个控件编写代码时,我不断收到一个错误消息,指出第二个控件尚未声明,这对我来说实际上很有意义,因为该表单实际上并不存在于页,直到有人在 formview 绑定到的 gridview 控件中选择一个索引。

我在想,为了做到这一点,我需要在 formview 的 edititem 事件上使用 .findcontrol 运算符。但是,当我尝试这样做时,我仍然收到有关未声明控件 ID 的错误。我会在这里粘贴到目前为止我尝试过的内容..

'' 这是我在后面的代码中填充第一个下拉列表的地方

    Dim dirEntry As DirectoryEntry = New DirectoryEntry("LDAP:MyIPaddress", "MyDomain/Username", "MyPassword", AuthenticationTypes.FastBind)

        Dim searcher As DirectorySearcher = New DirectorySearcher(dirEntry)

        '' Filter the search so that it only pulls up Active user accounts. The search filter "!userAccountControl:1.2.840.113556.1.4.803:=2" removes
        '' disabled users from the list. For a list of all attributes defined by Active Directory, see https://msdn.microsoft.com/en-us/library/ms675090(v=vs.85).aspx
        searcher.Filter = "(&(objectClass=User)(objectCategory=person)(!userAccountControl:1.2.840.113556.1.4.803:=2))"

        '' Loop through the search results and add each user as string types to list controls 
        Dim userNames As New List(Of String)

        For Each resEnt As SearchResult In searcher.FindAll()
            Dim userName As String = resEnt.Properties("name")(0).ToString()

            userNames.Add(userName)

        Next


        userNames.Sort()
        For Each userName In userNames
            userList.Items.Add(userName)

        Next

'' 到目前为止,这是我尝试找到第二个控件的过程...

    Protected Sub FormView1_DataBound(sender As Object, e As System.EventArgs) Handles FormView1.DataBound
    If FormView1.CurrentMode = FormViewMode.Edit Then
        DropDownList(userListEdit = FormView1.FindControl("userListEdit"))

    End If
End Sub

'' 当我尝试写最后一行来查找控件时,我收到一条错误消息,指出控件未声明。我试图在许多不同的在线论坛中找到解决方案。但似乎没有什么能准确地满足我的需要。有谁知道我如何找到这个控件并在后面的代码中复制内容?提前致谢!

从表面上看,答案可能很简单。您的代码是:

DropDownList(userListEdit = FormView1.FindControl("userListEdit"))

您需要做的是:

Dim ddlList As DropDownList = FormView1.FindControl("userListEdit")

或者您可以使用 DirectCast() 并直接访问:

DirectCast(FormView1.FindControl("userListEdit"), DropDownList) //.anyMethod()

@peyote 男孩 非常感谢您的回答。这向我展示了正确的语法。从那里我必须学习一些关于会话状态的知识才能得到我想要的结果。

在我的页面加载事件中,我添加了这行代码

    Session("userNames") = userNames 

这会使列表保持当前会话状态,以便我以后使用它。然后我用你的建议最终得到了我想要的结果。

    Protected Sub DetailsView1_Databound(sender As Object, e As System.EventArgs) Handles DetailsView1.DataBound
If DetailsView1.CurrentMode = DetailsViewMode.Edit Then 
    Dim ddlList As New DropDownList
    ddlList = DetailsView1.FindControl("userEditList") 
        For Each userName In Session("userNames") 
            ddlList.Items.Add(userName)
       Next
      End If 
      End Sub 

再次感谢您的帮助! :)