Создание настраиваемой части EditorPart в SharePoint - PullRequest
0 голосов
/ 19 июня 2009

Я использовал следующую статью в качестве руководства по созданию настраиваемой части EditorPart в SharePoint

http://blah.winsmarts.com/2006/05/19/writing-custom-editors-for-sharepoint-2007-and-aspnet-20-webparts.aspx

Однако, когда я реализую эту технику, я не могу сохранить изменения в моих пользовательских свойствах. В основном функция CreateChildControls вызывается, когда используются кнопки «Применить» или «Сохранить», и это создает новый экземпляр моей внутренней управляющей переменной, таким образом стирая любые изменения, сделанные пользователем.

Таким образом, когда вызывается функция ApplyChanges, все элементы управления возвращаются к настройкам по умолчанию.

У кого-нибудь есть советы по этому поводу?

Спасибо

UPDATE

Я просто не могу обернуть голову вокруг этого вообще. Однако я смотрю на это и застреваю в одной и той же точке: как я могу сохранить что-либо обратно в мою веб-часть в ApplyChanges (), когда сначала всегда запускается CreateChildCOntrols (), таким образом заменяя мой CheckBoxList новым экземпляром и, следовательно, без выбранных элементов. Я включил полный код, приведенный ниже, в надежде на то, что я просто тупик, и решение очевидно.

Private Class CaseMatterInfoEditorPart
    Inherits EditorPart

    Protected WithEvents _propList As CheckBoxList

    Protected Overrides Sub CreateChildControls()

        _propList = New CheckBoxList
        _propList.EnableViewState = True
        _propList.AutoPostBack = True
        _propList.Width = New Unit("100%")

        LoadProperties()

        Me.Controls.Add(New LiteralControl("Please select the data items you wish to include:<br />"))
        Me.Controls.Add(_propList)

    End Sub


    Public Overrides Function ApplyChanges() As Boolean

        Dim part As CaseMatterInfoPart = CType(WebPartToEdit,  _
                                               CaseMatterInfoPart)

        If part IsNot Nothing Then
            GetSelectedDataValues()
        Else
            Return False
        End If

        Return True

    End Function

    Public Overrides Sub SyncChanges()

        EnsureChildControls()

        Dim part As CaseMatterInfoPart = CType(WebPartToEdit,  _
                                               CaseMatterInfoPart)

        If part IsNot Nothing Then

            If Not String.IsNullOrEmpty(part.DataValues) Then
                SetSelectedValues(part.DataValues)
            End If

        End If


    End Sub

    Private Function GetSelectedDataValues() As String

        Dim strReturn As String = ""

        For Each item As ListItem In _propList.Items

            If item.Selected Then
                strReturn &= item.Text & "|"
            End If

        Next

        If Not String.IsNullOrEmpty(strReturn) Then
            strReturn = strReturn.Remove(strReturn.Length - 1, 1)
        End If

        Return strReturn

    End Function

    Private Sub SetSelectedValues(ByVal Values As String)

        If Not String.IsNullOrEmpty(Values) And _
            _propList IsNot Nothing Then

            _propList.ClearSelection()

            Dim split() As String = Values.Split("|")

            For Each strValue As String In split

                For Each item As ListItem In _propList.Items

                    If item.Text = strValue Then
                        item.Selected = True
                    End If

                Next

            Next

        End If

    End Sub

    Private Sub LoadProperties()

        Dim file As New File
        Dim lstProperties As List(Of String) = GetStringPropertyNames(file.GetType)

        For Each strProperty As String In lstProperties

            _propList.Items.Add(strProperty)

        Next

    End Sub

    Private Function GetStringPropertyNames(ByVal Type As System.Type) As List(Of String)

        Dim props() As PropertyInfo = Type.GetProperties
        Dim propList As New List(Of String)

        For Each prop As PropertyInfo In props

            If prop.Name <> "Chronology" And _
                    prop.Name <> "Documents" And _
                    prop.Name <> "Milestones" And _
                    prop.Name <> "DiaryEntries" And _
                    prop.Name <> "FileLoadSuccesful" And _
                    prop.Name <> "FileLoadError" Then

                Dim boo As Boolean = False
                Dim bootype As Type = boo.GetType
                Dim dec As Decimal
                Dim decType As Type = dec.GetType

                If prop.PropertyType Is "".GetType Or _
                    prop.PropertyType Is Now.GetType Or _
                    prop.PropertyType Is bootype Or _
                    prop.PropertyType Is decType Then

                    propList.Add(prop.Name)

                Else

                    Dim listChildPropertyStrings As List(Of String) = GetStringPropertyNames(prop.PropertyType)

                    For Each strProp As String In listChildPropertyStrings

                        propList.Add(prop.Name & ": " & strProp)

                    Next

                End If

            End If


        Next

        Return propList

    End Function

End Class

Надеюсь, кто-то там может увидеть то, что я не могу.

Спасибо

Ответы [ 3 ]

0 голосов
/ 19 июня 2009

Метод ApplyChanges () используется для извлечения содержимого пользовательского редактора и применения его к веб-части, в то время как метод SyncChanges () выполняет обратное действие, он принимает ранее сохраненные свойства в веб-части и обновляет редактор соответственно. Вы несете ответственность за написание логики для них обоих при создании собственного редактора.

0 голосов
/ 22 июня 2009

Было бы полезно, если бы я действительно сохранил строку, возвращенную из GetSelectedDataValues ​​(), в свойство веб-части ...

Фактический код должен выглядеть следующим образом:

Public Overrides Function ApplyChanges() As Boolean        
    Dim part As CaseMatterInfoPart = CType(WebPartToEdit, CaseMatterInfoPart)        
    If part IsNot Nothing Then            
        part.DataValues = GetSelectedDataValues()        
    Else            
        Return False        
    End If        
    Return True    
End Function

Очень часто стоит проверять, перепроверять и перепроверять, что вы делаете. Я серьезно обдумал этот вопрос в поисках ответа, который смотрел мне в лицо.

0 голосов
/ 19 июня 2009

Обычно я запускаю свой EditorPart с помощью кода в этой статье: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.webparts.editorpart.aspx никогда не было таких проблем.

Похоже, у вас есть проблема с потоком управления в ASP.NET, но без кода трудно понять, что это такое.

...