2012-02-22 49 views
0

因此,让我们开始我新的编码部件和一般。我最初编写这个vb的asp页面,它工作正常。现在转换到SharePoint 2010 web部件(不是可视化web部件)。 该项目是列表框1有他们管理的用户组,列表框2中有用户在该组中,列表框3中所有用户都不在列表框中2Sharepoont 2010的WebPart vb.net列表框SelectIndexChanged和错误

我确信有很多这应该是固定。就像不要在管理员登录中获取数据一样。 但是我有问题是:如果选择一组,将显示适当的数据,但是选择的第二组或选择用户添加;同样的错误。

错误: “未能加载视图状态的控制树成视图状态是正在装载必须的是使用以前的请求期间保存视图状态控制树匹配”。

而且仍在试图弄清楚如何做按钮来添加用户。 需要一些认真的帮助。我知道部分帖子后面只是很难找到资源。

下面是代码:

Imports System 
Imports System.ComponentModel 
Imports System.Web 
Imports System.Web.UI 
Imports System.Web.UI.WebControls 
Imports System.Web.UI.WebControls.WebParts 
Imports Microsoft.SharePoint 
Imports Microsoft.SharePoint.WebControls 
Imports ActiveDs 
Imports System.DirectoryServices 
Imports System.Data 
Imports ADODB 
Imports System.Runtime.InteropServices 


<ToolboxItemAttribute(False)> _ 
Public Class Groups 
Inherits System.Web.UI.WebControls.WebParts.WebPart 


Private LBgrp As ListBox 
Private LBgrpmem As ListBox 
Private LBaddgrp As ListBox 
Private btnadd As Button 

Protected Overrides Sub CreateChildControls() 


    Me.LBgrpmem = New ListBox 
    Me.LBgrpmem.AutoPostBack = True 
    Me.LBgrpmem.DataValueField = "sAMAccountName" 
    Me.LBgrpmem.DataTextField = "displayName" 
    Me.LBgrpmem.DataBind() 
    Me.LBgrpmem.Rows = 8 
    Me.LBgrpmem.Width = 170 
    Me.LBgrpmem.Height = 350 
    Me.LBgrpmem.Items.Insert(0, New ListItem("-- Current Members --")) 
    Me.Controls.Add(LBgrpmem) 

    Me.LBaddgrp = New ListBox 
    Me.LBaddgrp.AutoPostBack = True 
    Me.LBaddgrp.DataTextField = "displayName" 
    Me.LBaddgrp.DataValueField = "sAMAccountName" 
    Me.LBaddgrp.DataBind() 
    Me.LBaddgrp.Items.Insert(0, New ListItem("-- Add Users --")) 
    Me.LBaddgrp.Width = 170 
    Me.LBaddgrp.Height = 350 
    AddHandler LBaddgrp.SelectedIndexChanged, New EventHandler(AddressOf DLAdd_SelectedIndexChanged) 
    Me.Controls.Add(LBaddgrp) 

    Me.btnadd = New Button() 
    ' AddHandler Me.btnadd.Click, New EventHandler(AddressOf Click_btnadd) 
    Me.btnadd.Text = "Add User" 
    Me.Controls.Add(btnadd) 


End Sub 


Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 




    Dim oRootDSE = GetObject("LDAP://RootDSE") 
    Dim sDomainADsPath = "LDAP://" & oRootDSE.Get("defaultNamingContext") 
    Dim oCon As New ADODB.Connection 
    Dim oRecordSet As New ADODB.Recordset 
    Dim oCmd As New ADODB.Command 

    Dim sFullUser As String = Environment.UserName 

    Dim sProperties = "name,ADsPath,description,member,memberof,managedObjects" 
    Dim sGroup = "*" 
    Dim aMember 
    Dim iCount 

    oCon.ToString() 
    oCmd.ToString() 
    sFullUser.ToString() 
    sProperties.ToString() 
    sDomainADsPath.ToString() 

    oCon.Provider = "ADsDSOObject" 
    oCon.Open("ADProvider", "[email protected]", "ADMINPASSWORD") 
    oCmd.ActiveConnection = oCon 
    oCmd.CommandText = "<" & sDomainADsPath & ">;(&(objectCategory=person)(objectClass=user)(sAMAccountName=" & sFullUser & "));" & sProperties & ";subtree" 
    oRecordSet = oCmd.Execute 


    Dim de As DirectoryServices.DirectoryEntry = New DirectoryServices.DirectoryEntry(sDomainADsPath, "[email protected]", "ADMINPASSWORD", DirectoryServices.AuthenticationTypes.Secure) 
    Dim i As Integer = 0 
    Dim sl As SortedList = New SortedList(New CaseInsensitiveComparer) 
    de.ToString() 

    While Not oRecordSet.EOF 

     aMember = oRecordSet.Fields("managedObjects").Value 
     If Not IsDBNull(aMember) Then 
      For iCount = 0 To UBound(aMember) 
       Dim groupDN As String = ("distinguishedName=" & aMember(iCount)) 
       Dim src As DirectoryServices.DirectorySearcher = New DirectoryServices.DirectorySearcher("(&(objectCategory=Group)(" & groupDN & "))") 
       src.SearchRoot = de 
       src.SearchScope = DirectoryServices.SearchScope.Subtree 
       For Each res As DirectoryServices.SearchResult In src.FindAll 
        sl.Add(res.Properties("name")(0).ToString, i) 
        i += 1 
       Next 


      Next 
     End If 
     oRecordSet.MoveNext() 
    End While 

    Me.LBgrp = New ListBox 
    Me.LBgrp.AutoPostBack = True 
    Me.LBgrp.DataSource = sl 
    Me.LBgrp.DataTextField = "key" 
    Me.LBgrp.DataValueField = "value" 
    Me.LBgrp.DataBind() 
    Me.LBgrp.Items.Insert(0, New ListItem("-- Groups --")) 
    Me.Controls.Add(LBgrp) 
    Me.LBgrp.SelectedIndex = 0 
    AddHandler LBgrp.SelectedIndexChanged, New EventHandler(AddressOf LBgrp_SelectedIndexChanged) 
    LBgrp.SelectedItem.ToString() 

End Sub 


Protected Sub LBgrp_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) 'Handles LBgrp.SelectedIndexChanged 


    Dim strQuery As String = "" & LBgrp.SelectedItem.Text.ToString() & "'" 



    'LBgrpmem.Items.Clear() 
    Dim oRootDSE2 = GetObject("LDAP://RootDSE") 
    Dim sDomainADsPath2 = "LDAP://" & oRootDSE2.Get("defaultNamingContext") 
    Dim oCon2 As New ADODB.Connection 
    Dim oRecordSet2 As New ADODB.Recordset 
    Dim sFullUser2 As String = Environment.UserName 
    Dim oCmd2 As New ADODB.Command 
    Dim sProperties2 = "name,ADsPath,description,member,memberof,managedObjects" 
    Dim grpADsPath2 
    Dim grpdsplynm2 
    oRootDSE2 = Nothing 
    oCon2.Provider = "ADsDSOObject" 
    oCon2.Open("ADProvider", "[email protected]", "ADMINPASSWORD") 
    oCmd2.ActiveConnection = oCon2 
    oCmd2.CommandText = "<" & sDomainADsPath2 & ">;(&(objectCategory=group)(objectClass=group)(CN=" & LBgrp.SelectedItem.Text & "));" & sProperties2 & ";subtree" 

    oRecordSet2 = oCmd2.Execute 
    While oRecordSet2.EOF 
     grpADsPath2 = oRecordSet2.Fields("ADsPath").Value 
     grpADsPath2.ToString() 

     grpdsplynm2 = grpADsPath2.remove(0, 7) 
     grpdsplynm2.ToString() 
     oRecordSet2.MoveNext() 
    End While 

    While Not oRecordSet2.EOF 
     grpADsPath2 = oRecordSet2.Fields("ADsPath").Value 
     grpADsPath2.ToString() 

     grpdsplynm2 = grpADsPath2.remove(0, 7) 
     grpdsplynm2.ToString() 
     oRecordSet2.MoveNext() 
    End While 
    Dim groupDN2 As String = "" & grpdsplynm2 & "" 
    Dim filter As String = [String].Format("(&(objectClass=user)(objectCategory=person)(memberOf={0}))", groupDN2) 

    Me.LBgrpmem.AutoPostBack = True 
    Me.LBgrpmem.DataSource = FindUsers(filter, New String() {"sAMAccountName", "displayName"}, sDomainADsPath2, True) 
    Me.LBgrpmem.DataValueField = "sAMAccountName" 
    Me.LBgrpmem.DataTextField = "displayName" 
    Me.LBgrpmem.DataBind() 
    Me.LBgrpmem.Items.Insert(0, New ListItem("-- Current Members --")) 
    Me.Controls.Add(LBgrpmem) 

    Dim usrDN As String = "" & grpdsplynm2 & "" 
    usrDN.ToString() 
    Dim usrfilter As String = [String].Format("(&(objectClass=user)(objectCategory=person)(!memberOf={0}))", groupDN2) 

    Me.LBaddgrp.AutoPostBack = True 
    Me.LBaddgrp.DataSource = FindUsers(usrfilter, New String() {"sAMAccountName", "displayName"}, sDomainADsPath2, True) 
    Me.LBaddgrp.DataTextField = "displayName" 
    Me.LBaddgrp.DataValueField = "sAMAccountName" 
    Me.LBaddgrp.DataBind() 
    Me.LBaddgrp.Items.Insert(0, New ListItem("-- Add Users --")) 
    'AddHandler LBaddgrp.SelectedIndexChanged, New EventHandler(AddressOf DLAdd_SelectedIndexChanged) 
    Me.Controls.Add(LBaddgrp) 


End Sub 

Public Function FindUsers(ByVal sFilter As String, ByVal columns() As String, ByVal path As String, ByVal useCached As Boolean) As Data.DataSet 

    Dim oRootDSE = GetObject("LDAP://RootDSE") 
    Dim sDomainADsPath = "LDAP://" & oRootDSE.Get("defaultNamingContext") 

    'try to retrieve from cache first 
    Dim context As HttpContext = HttpContext.Current 
    Dim userDS As Data.DataSet = CType(context.Cache(sFilter), Data.DataSet) 

    If userDS Is Nothing Or Not useCached Then 
     'setup the searching entries 
     Dim deParent As New DirectoryServices.DirectoryEntry(sDomainADsPath, "[email protected]", "ADMINPASSWORD", DirectoryServices.AuthenticationTypes.Secure) 

     Dim ds As New DirectoryServices.DirectorySearcher(deParent, sFilter, columns, DirectoryServices.SearchScope.Subtree) 

     ds.PageSize = 1000 
     ds.Sort.PropertyName = "displayName" 'sort option 

     Using (deParent) 
      userDS = New Data.DataSet("userDS") 
      Dim dt As Data.DataTable = userDS.Tables.Add("users") 
      Dim dr As Data.DataRow 

      'add each parameter as a column 
      Dim prop As String 
      For Each prop In columns 
       dt.Columns.Add(prop, GetType(String)) 
      Next prop 

      Dim src As DirectoryServices.SearchResultCollection = ds.FindAll 
      Try 
       Dim sr As DirectoryServices.SearchResult 
       For Each sr In src 
        dr = dt.NewRow() 
        For Each prop In columns 
         If sr.Properties.Contains(prop) Then 
          dr(prop) = sr.Properties(prop)(0) 
         End If 
        Next prop 
        dt.Rows.Add(dr) 
       Next sr 
      Finally 
       src.Dispose() 
      End Try 
     End Using 
     'cache it for later, with sliding window 
     context.Cache.Insert(sFilter, userDS, Nothing, DateTime.MaxValue, TimeSpan.FromSeconds(10)) 
    End If 
    Return userDS 
End Function 'FindUsers 


Protected Sub DLAdd_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) 'Handles Click_btnadd 

    Dim oRootDSE = GetObject("LDAP://RootDSE") 
    Dim sDomainADsPath = "LDAP://" & oRootDSE.Get("defaultNamingContext") 
    Dim oCon As New ADODB.Connection 
    Dim oRecordSet As New ADODB.Recordset 
    Dim oRcrdSet As New ADODB.Recordset 
    Dim oCmd As New ADODB.Command 
    Dim oCmd1 As New ADODB.Command 
    Dim sGroup = "*" 
    Dim sProperties = "name,ADsPath,description,member,memberof,proxyAddresses" 
    Dim grpADsPath 
    Dim grpdsplynm 
    Dim addusrADsPath 
    Dim addusrname 


    oRootDSE = Nothing 
    oCon.Provider = "ADsDSOObject" 
    oCon.Open("ADProvider", "[email protected]", "ADMINPASSWORD") 
    oCmd.ActiveConnection = oCon 
    oCmd1.ActiveConnection = oCon 

    oCmd.CommandText = "<" & sDomainADsPath & ">;(&(objectClass=group)(cn=" & LBgrp.SelectedItem.Text & "));" & sProperties & ";subtree" 
    oRecordSet = oCmd.Execute 
    'Group Query 
    While Not oRecordSet.EOF 
     grpADsPath = oRecordSet.Fields("ADsPath").Value 
     grpdsplynm = oRecordSet.Fields("name").Value 
     oRecordSet.MoveNext() 
    End While 

    oCmd1.CommandText = "<" & sDomainADsPath & ">;(&(objectCategory=person)(objectClass=user)(cn=" & LBaddgrp.SelectedItem.Text & "));" & sProperties & ";subtree" 
    oRcrdSet = oCmd1.Execute 
    'User query 
    While Not oRcrdSet.EOF 
     addusrADsPath = oRcrdSet.Fields("ADsPath").Value 
     addusrname = oRcrdSet.Fields("name").Value 
     oRcrdSet.MoveNext() 
    End While 

    ' Bind directly to the group 
    ' 

    Dim oRootDSE2 = GetObject("LDAP://RootDSE") 
    Dim sDomainADsPath2 = "LDAP://" & oRootDSE2.Get("defaultNamingContext") 
    Dim oCon2 As New ADODB.Connection 
    Dim oRecordSet2 As New ADODB.Recordset 
    Dim sFullUser2 As String = Environment.UserName 
    'Dim sFullUser2 = Request.ServerVariables("LOGON_USER") 
    'Dim sUser2 = Split(sFullUser2, "\", -1) 
    Dim oCmd2 As New ADODB.Command 
    Dim sProperties2 = "name,ADsPath,description,member,memberof,managedObjects" 
    Dim grpADsPath2 
    oRootDSE2 = Nothing 
    oCon2.Provider = "ADsDSOObject" 
    oCon2.Open("ADProvider", "[email protected]", "ADMINPASSWORD") 
    oCmd2.ActiveConnection = oCon2 
    oCmd2.CommandText = "<" & sDomainADsPath2 & ">;(&(objectCategory=group)(objectClass=group)(CN=" & LBgrp.SelectedItem.Text & "));" & sProperties2 & ";subtree" 

    oRecordSet2 = oCmd2.Execute 
    While Not oRecordSet2.EOF 
     grpADsPath2 = oRecordSet2.Fields("ADsPath").Value 
     oRecordSet2.MoveNext() 
    End While 


    Dim group As New DirectoryServices.DirectoryEntry("" & grpADsPath2 & "", "[email protected]", "ADMINPASSWORD", DirectoryServices.AuthenticationTypes.Secure) 

    Dim user As New DirectoryServices.DirectoryEntry(addusrADsPath, "[email protected]", "ADMINPASSWORD", DirectoryServices.AuthenticationTypes.Secure) 


    Dim isMember As Boolean = Convert.ToBoolean(group.Invoke("IsMember", New Object() {user.Path})) 
    If isMember Then 
     ' 
     ' TO CREATE ERROR MESSAGE 
    Else 
     ' Add the user to the group by invoking the Add method 
     ' 
     group.Invoke("Add", New Object() {user.Path}) 
    End If 

    If Not IsNothing(user) Then 
     user.Dispose() 
    End If 
    If Not IsNothing(group) Then 
     group.Dispose() 
    End If 
    Console.ReadLine() 

    If (Err.Number <> 0) Then 
     ' TO CREATE ERROR MESSAGE 
    Else 
     ' TO CREATE SUCCESS MESSAGE 
    End If 
End Sub 

Protected Overrides Sub Render(writer As System.Web.UI.HtmlTextWriter) 


    LBgrp.RenderControl(writer) 
    LBgrpmem.RenderControl(writer) 
    LBaddgrp.RenderControl(writer) 
    btnadd.RenderControl(writer) 


End Sub 

End Class 
+0

你做的是清理代码和代码示例删除调试的东西,它可以帮助人们阅读你的代码并理解它。 – b0rg 2012-02-22 20:07:08

回答

0

,如果没记错的话,Page_Load事件是射击回发过,在那里你试图向下创建下降的另一个实例。因此,系统试图从ViewState重新创建ListBox的状态,但它不是相同的ListBox,因为您刚刚重新创建它。所以它吠叫。

为了避免它,在Page_Load只能创建“父”下拉如果它不回发。即

Begin Page_Load() 
    If !Page.IsPostBack() Then 
     'load code here 
    End If 
End Page_Load 

也没有必要写 Me.LBgrpmem =新的ListBox

,因为它已经创建。更改数据源通常是enuff。

+0

如果我删除Me.LBgrpmem =新的ListBox我得到的对象引用未设置为对象的实例。 – user1226555 2012-02-22 19:27:51

+0

你说得对。这里有一个很好的链接http://bilbrobloggins.com/sharepoint/dropdown-list-box-filter-web-part-in-sharepoint-ndash-part-two/ 看起来像所有的初始数据绑定需要在OnLoad事件发生检查IsPostBack后。 – b0rg 2012-02-22 19:49:36

+0

所以我想通过回发问题,谢谢。我在Protected Sub _SelectedIndexChanged上添加了“If Page.IsPostBack Then”。下一步了解如何让按钮正常工作......再次感谢您。 – user1226555 2012-02-22 19:58:03