[VB.NET]Treeview onAfterLabelEdit event

Pagina: 1
Acties:

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Topicstarter
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:
Visual Basic .NET:
1
treeview.SelectedNode.BeginEdit();
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.

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 ]


  • Remco
  • Registratie: Januari 2001
  • Laatst online: 09:25
Een grid heeft deze bug ook dat de grid in edit mode blijft staan.
Dan moet je voor endedit nog een:
grid1.activerow = nothing
geven, misschien moet dat ook met een treeview.

The best thing about UDP jokes is that I don't care if you get them or not.


  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Topicstarter
Remc0 schreef op donderdag 06 januari 2005 @ 16:49:
Een grid heeft deze bug ook dat de grid in edit mode blijft staan.
Dan moet je voor endedit nog een:
grid1.activerow = nothing
geven, misschien moet dat ook met een treeview.
Dat gaat niet werken. Is hetzelfde als met treeview het volgende:
Visual Basic .NET:
1
treeview1.SelectedNode = Nothing

Maar dit gaat niet werken. Hij moet namelijk de node uit edit mode halen, maar dat lukt niet met dit.

  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

Hmm.. Als niets anders werkt, dan Quick and Dirty: 8)
Timertje (uit System.Windows.Form ; System.Thread of die andere.. ;) ) maken op 10 ms ofzo en daar de update in uitvoeren.

Netjes is anders, ik geef het onmiddelijk toe.. :)

Als je de State (of ie in edit-state staat ja/nee) kan opvragen, zou je een aparte Thread kunnen gebruiken die in een While-lusje hangt totdat de State goed is.

[ Voor 42% gewijzigd door MrSleeves op 07-01-2005 10:20 ]

30Drie Web Design & IT Consultancy | Raven Consultancy Services


  • Remco
  • Registratie: Januari 2001
  • Laatst online: 09:25
eghie schreef op vrijdag 07 januari 2005 @ 09:42:
[...]

Dat gaat niet werken. Is hetzelfde als met treeview het volgende:
Visual Basic .NET:
1
treeview1.SelectedNode = Nothing

Maar dit gaat niet werken. Hij moet namelijk de node uit edit mode halen, maar dat lukt niet met dit.
Daarna moet je natuurlijk nog een endedit geven.

The best thing about UDP jokes is that I don't care if you get them or not.


  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Topicstarter
Remc0 schreef op vrijdag 07 januari 2005 @ 10:44:
[...]

Daarna moet je natuurlijk nog een endedit geven.
Je kunt geen node die nothing is de edit state van veranderen.
Chief.NET schreef op vrijdag 07 januari 2005 @ 10:19:
Hmm.. Als niets anders werkt, dan Quick and Dirty: 8)
Timertje (uit System.Windows.Form ; System.Thread of die andere.. ;) ) maken op 10 ms ofzo en daar de update in uitvoeren.

Netjes is anders, ik geef het onmiddelijk toe.. :)

Als je de State (of ie in edit-state staat ja/nee) kan opvragen, zou je een aparte Thread kunnen gebruiken die in een While-lusje hangt totdat de State goed is.
Dat zou kunnen ja, niet echt mooi nee, maar is tenminste iets. ;) Na al die zelfmoordpogingen moet je toch wat doen he ;) :+
Pagina: 1