2012-02-22 5 views
0

まずは、コードウィジェットと一般的には初めてです。私はもともとaspページのVBでこれをコード化していたし、正常に動作します。今すぐSharePoint 2010 Webパーツ(ビジュアルWebパーツではない)に変換します。 プロジェクトはリストボックス1は管理しているユーザーグループがあり、リストボックス2にはそのグループのユーザーがあり、リストボックス3はリストボックス2にないユーザーです。Sharepoont 2010 webpart vb.netリストボックスSelectIndexChangedとエラー

修正する。管理者のログイン情報を入力しない しかし、私が持っている問題は、グループを選択すると、適切なデータが表示されますが、2番目のグループを選択するか、追加するユーザーを選択することです。同じエラー。

エラー: "viewstateを読み込めませんでした。viewstateがロードされているコントロールツリーは、前の要求時にviewstateを保存するために使用されたコントロールツリーと一致する必要があります。

また、ユーザーを追加するためのボタンの操作方法を理解しようとしています。 深刻な助けをお願いします。私はポストの一部を知っているだけで、リソースを見つけるのに苦労している。以下は

コードです:

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

答えて

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 = New ListBoxを削除した場合、オブジェクト参照がオブジェクトのインスタンスに設定されません。 – user1226555

+0

あなたは正しいです。ここでは良いリンクhttp://bilbrobloggins.com/sharepoint/dropdown-list-box-filter-web-part-in-sharepoint-ndash-part-two/ は、すべての初期データバインディングがOnLoadイベントで発生する必要があるようですIsPostBackをチェックした後。 – b0rg

+0

私はポストバック問題を考え出しました、ありがとう。保護されたサブ_SelectedIndexChangedの両方で「If Page.IsPostBack Then」を追加します。ボタンを機能させる方法を理解する次のステップ...もう一度ありがとうございます。 – user1226555

関連する問題