Ik ben bezig met een applicatie te bouwen om outlook contactpersonen te beheren. Dit doe ik in VB.NET. Nu kun je de contactpersonen en mappen benaderen via een treeview. Nu wil in ze gewoon kunnen renamen met de functie die de treeview al in heeft gebouwd, namelijk LabelEdit. Deze kun je aanroepen met:
Als ik de naam gewijzigd heb van die node, wil ik die ook wijzigen in outlook en daarnee de map, waarin de contactpersoon staat, refreshen, zodat je de nieuwste gegevens binnen krijgt.
Nu gaat het bij het refreshen fout. Als ik de parent node van de contactpersoon (de map waarin hij staat) wil refreshen, behoud hij de editstate. Dus de textbox blijft staan, waarin je de naam kunt wijzigen, maar de naam moet gewoon weer vast worden.
Met de volgende code refresh ik de node:
Deze functie die werkt. Dit weet ik zeker, want als ik heb buiten de AfterLabelEdit event uitvoer werkt hij, maar als ik dit binnen de event gebruik blijft de node wat ik edit op de edit state staan.
Zo is ongeveer de AfterLabelEdit event ingedeelt:
Ik ben er denk ik ook achter gekomen wat het probleem kan zijn. Als deze event wordt uitgevoerd is de state van de node nog staat op edit state. Volgens mij en een collega van mij hoort dat niet, omdat deze event uitgevoerd moet worden na dat de label geedit is. Dat doet het echter niet.
omdat ik de parent node refresh kan de treeview hem niet meer van de edit mode afhalen omdat hij hem dan niet meer kan vinden. Dus hij blijft op edit mode staan en dan wil ik hem wegklikken en dan voert hij uiteraard weer de afterlabeledit event uit. Zo raak je in een oneindige loop.
Heeft iemand dit probleem wel eens gehad en/of weet hoe je het kunt oplossen.
Die 2 regels waar dat commentaar achter staat in afterlabeledit event zijn de "logische" dingen die ik heb geprobeerd. Ik heb wel meer geprobeerd, maar die dingen waren aardig vies en werkten ook niet echt. (met onclick enzo) Via goole en GoT search ook niks gevonden hierover.
Heb overigens e.CancelEdit = True ook al geprobeert, wat volgens de MSDN voorbeelden moet werken, maar dat werkt ook niet.
Visual Basic .NET:
Nu krijg je bij de node die je wilt editten de mogelijkheid om de naam te veranderen. Als je de naam veranderd hebt en je druk op enter of je klikt ergens anders, dan wordt het event AfterLabelEdit geraised. Allemaal heel leuk een aardig, maar met dat event AfterLabelEdit heb ik een probleem.1
| treeview.SelectedNode.BeginEdit(); |
Als ik de naam gewijzigd heb van die node, wil ik die ook wijzigen in outlook en daarnee de map, waarin de contactpersoon staat, refreshen, zodat je de nieuwste gegevens binnen krijgt.
Nu gaat het bij het refreshen fout. Als ik de parent node van de contactpersoon (de map waarin hij staat) wil refreshen, behoud hij de editstate. Dus de textbox blijft staan, waarin je de naam kunt wijzigen, maar de naam moet gewoon weer vast worden.
Met de volgende code refresh ik de node:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
| Private Sub RefreshNode(ByRef Node As TreeNode) Dim _Outlook As New OutlookLayer Try 'Ververs de zooi Node.Nodes.Clear() _Outlook.SelectSubFoldersAndContacts(Node.Nodes, Node.Tag.Folder) Catch Ex As Exception MessageBox.Show(Ex.Message) End Try End Sub |
Deze functie die werkt. Dit weet ik zeker, want als ik heb buiten de AfterLabelEdit event uitvoer werkt hij, maar als ik dit binnen de event gebruik blijft de node wat ik edit op de edit state staan.
Zo is ongeveer de AfterLabelEdit event ingedeelt:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| Private Sub treeview1_AfterLabelEdit(ByVal sender As Object, _ ByVal e As System.Windows.Forms.NodeLabelEditEventArgs) _ Handles trvContacts.AfterLabelEdit ' 'Sla de gegevens van de node op ' trvContacts.SelectedNode.EndEdit(False) 'Geprobeerd e.Node.EndEdit(False) 'ook geprobeerd 'Ververs de parent node (de map waarin de contact staat) RefreshNode(e.Node.Parent) Catch Ex As Exception MsgBox(Ex.Message) End Try End Sub |
Ik ben er denk ik ook achter gekomen wat het probleem kan zijn. Als deze event wordt uitgevoerd is de state van de node nog staat op edit state. Volgens mij en een collega van mij hoort dat niet, omdat deze event uitgevoerd moet worden na dat de label geedit is. Dat doet het echter niet.
omdat ik de parent node refresh kan de treeview hem niet meer van de edit mode afhalen omdat hij hem dan niet meer kan vinden. Dus hij blijft op edit mode staan en dan wil ik hem wegklikken en dan voert hij uiteraard weer de afterlabeledit event uit. Zo raak je in een oneindige loop.
Heeft iemand dit probleem wel eens gehad en/of weet hoe je het kunt oplossen.
Die 2 regels waar dat commentaar achter staat in afterlabeledit event zijn de "logische" dingen die ik heb geprobeerd. Ik heb wel meer geprobeerd, maar die dingen waren aardig vies en werkten ook niet echt. (met onclick enzo) Via goole en GoT search ook niks gevonden hierover.
Heb overigens e.CancelEdit = True ook al geprobeert, wat volgens de MSDN voorbeelden moet werken, maar dat werkt ook niet.
[ Voor 3% gewijzigd door eghie op 06-01-2005 16:35 ]