TreeView1_AfterLabelEdit   otázka

VB.NET, WinForms

Mám událost, která ošetřuje, aby se text TreeNode po přejmenování změnil na ten samý text s mezerami nahrazenými podtržítky:

    Private Sub TreeView1_AfterLabelEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.NodeLabelEditEventArgs) Handles TreeView1.AfterLabelEdit
        TreeView1.Nodes(e.Node.Index).Text = e.Node.Text.Replace(" ", "_")
    End Sub

ale po přejmenování se text nezmění, proč?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkuste tohle:

e.Node.Text = e.Node.Text.Replace(" ", "_")

nahlásit spamnahlásit spam 0 odpovědětodpovědět

nevím, co dělám špatně, ale uvedený příklad mi nefunguje. A navíc se mi to chová nějak divně.

Nejprve jsem Vaši radu modifikoval na:

e.Node.Text = e.Label.Replace(" ", "_")

,protože e, jako NodeLabelEditEventArgs vrací novou hodnotu ve vlastnosti label (ve vlastnosti node.text je v tomto okamžiku stále ta stará - a testováním se mi to potvrdilo),

jenomže protože ani to nevedlo ke kýženému výsledku, ještě jsem celý příklad rozšířil:

Private Sub TreeView1_AfterLabelEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.NodeLabelEditEventArgs) Handles TreeView1.AfterLabelEdit

  e.Node.Text = e.Label.Replace(" ", "_")

  MsgBox(TreeView1.SelectedNode.Text)

    
End Sub

a chování tohoto mne zmátlo již docela.

Pokud totiž upravuju node s názvem (i textem) Node6 a přepíši jej na "a b c", ve chvíli, kdy tuto změnu potvrdím, msgbox mi zobrazí správnou modifikovanou hodnotu "a_b_c" a stejný text (správný) se mi objeví i na příslušném místě treeview (pokud bych nechal v přiřazovacím příkaze "... = e.node.text.replace...", pak se mi v této chvíli objeví na obou místech původní text, tj. Node6).

Jenomže jakmile potvrdím msgbox (a doběhne mi tak celé ošetření události změny v treeview), vrátí se mi do popisky nodu v treeview původní "a b c".

Jako by byla zakázána programová změna textu v node. Neexistuje tam ještě nějaká blokace? Nebo jakým mechanismem se tam vrací ta původní(zadaná v průběhu editace) hodnota?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No právě to se stalo i mě, zkoušel jsem opravdu všechno, ale po přejmenování se mi to nikdy nenahradí. Zatím jsem to ošetřil tak, že po přejmenování projedu celý strom a text každé Node nahradím textem s Replce(" ", "_"). Ale to je podle mne strašně prasácké a neelegantní.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak už mi to došlo - stačí to napsat a přečíst po sobě, a hned se vám zapálí.

Chování je celkem jasné. V okamžiku ukončení editace nódu, jak jsem psal výše, v jeho vlastnosti "text" zůstává stále ta původní hodnota a ta nová, kterou jsme právě zadali, je ve vlastnosti e.label.

Takže si s textem u nodu můžeme dělat cokoliv, stejně je nám to k ničemu, protože to funguje tak, že do vlastnosti text nám přímo VB přiřadí původně zadanou hodnotu (uloženou v e.label) až po skončení ošetření události "AfterLabelEdit". Takže cokoliv jsme udělali my, stejně program vrátí do stavu, jaký jsme zadali v rámci editace textu u nodu.

Nejlepší by proto bylo změnit "e.label", ale ten je, bohužel, pouze pro čtení. A protože jsem nenašel událost, která by se vyvolala PO vlastním přepsání textu u daného node, zkusil jsem na to jít druhou možnou cestou, zakázat VB, aby sám provedl editaci, kterou má na mysli - a má ty prostoto, ono to funguje.

Nevím, nakolik je tento přístup správným, ale funkčním se mi ukázal být následující kód:

Private Sub TreeView1_AfterLabelEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.NodeLabelEditEventArgs) Handles TreeView1.AfterLabelEdit

   e.Node.Text = e.Label.Replace(" ", "_")
   e.CancelEdit = True

End Sub

Snad Vám to pomůže ve Vašem snažení.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback