Criando um EditorPart personalizado no SharePoint
-
06-07-2019 - |
Pergunta
Eu tenho usado o seguinte artigo como um guia para a criação de um EditorPart personalizado no SharePoint
No entanto, quando eu implementar esta técnica não pode salvar as alterações para minhas propriedades personalizadas. Basicamente a função CreateChildControls é chamado quando são utilizados o 'Aplicar' ou 'Save' botões e isso cria uma nova instância do meu variável de controle interno, limpando assim, altera qualquer o usuário fez.
Assim, quando a função ApplyChanges é chamado de todos os controles estão de volta para as configurações padrão.
Alguém tem algum conselho sobre isso?
Graças
Atualização
Eu não sou apenas capaz de envolver minha cabeça em torno de tudo isso. No entanto, eu olhar para isso eu ficar preso no mesmo ponto, como posso salvar nada de volta para a minha parte web em ApplyChanges () quando CreateChildControls () sempre é executado primeiro, assim, substituir o meu CheckBoxList com uma nova instância e itens, portanto, nenhuma selecionados. Eu incluí o código completo abaixo, na esperança de que eu estou sendo um burro total ea solução é óbvia.
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
espero que alguém lá fora, pode ver o que eu não posso.
Graças
Solução 3
Seria bom se eu tinha realmente salvou a cadeia devolvida a partir GetSelectedDataValues ??() em uma propriedade por parte web ...
código real deve ficar assim:
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
É muitas vezes vale a pena verificar, verificação de casal e triplos verificar o que está fazendo. Eu tinha serioulsy mais complicada esta questão procurando uma resposta que estava me olhando na cara.
Outras dicas
Normalmente, eu começo a minha EditorPart com o código neste artigo: http://msdn.microsoft. com / en-us / library / system.web.ui.webcontrols.webparts.editorpart.aspx nunca tive quaisquer problemas.
Parece que você tem um problema com o fluxo de controle no ASP.NET, mas sem código é difícil ver o que é.
O ApplyChanges () é usado para levar o conteúdo do editor personalizado e aplicá-las para a Web Part, enquanto o SyncChanges () método faz o oposto, leva as propriedades previamente armazenados na Web Part e atualiza o editor de conformidade. É de sua responsabilidade de escrever a lógica para ambos ao criar um editor personalizado.