TreeView - zakázání node   zodpovězená otázka

VB.NET, WinForms

Zdravím,

v aplikaci pro navigaci používám TreeView. Potřeboval bych některé node zakázat (enable=false) aby si je uživatel nemohl vybrat (buď proto že v danou chvíli akce není dostupná nebo např. uživatel nemá dostatečné oprávnění akci provést). Bohužel jsem tuto vlastnost nenašel. Neřešil jste někdo obdobný problém? Jde to nějákým způsobem lehce udělat nebo pokud budu tuto funcki chtít budu si ji muset dopsat?

Něco málo jsem vygooglil ale bylo to pro VB6 nebo to byla nějáká šílenost a abych se přiznal moc jsem tomu kódu nerozumněl (nejde mi jen o to nacpat to za každou cenu do aplikace, ale chci tomu hlavně porozumět).

Díky za reakce:)

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

Pokud je to UI ve stylu Průzkumník - vlevo TreeView, vpravo ListView nebo Panel s ovládacími prvky, potom lze při klepnutí na nedovolenou větev zakázat/schovat celou pravou část, takhle jsem to řešil já.

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

No je to spíše tak že po klepnutí se otevře childForm do kterého se načtou z databáze požadované údaje.A ne každý uživatel má přístup do všech formulářů. Myslel jsem že by bylo pěkné a pro uživatele přehlednější kdyby hned na první pohled viděl jaké akce může provádět a jaké ne, než že někam klikne a teprve pak na něj vyskočí hláška že pro tuto akci nemá oprávnění.

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

No z uživatelského hlediska je zcela nevhodné aby se otevíralo nějaké další okno, tím spíše je-li modální (když není tak se zase musí ošetřovat aby nešlo otevřít vícekrát apod.), což zamezuje další práci v mateřském okně. Doporučuji předělat to na průzkumnický styl, uživatelský komfort a minimum klikání je zásada při návrhu UI. Inspirujte se Průzkumníkem, Konzolí pro správu a dalšími Windows aplikacemi. Pro uvedené účely lze krásně použít TabControl bez záložek.

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

Nápad dle doporučení konkurenčního fóra:

Public Class Form1
    Dim WithEvents tv As TreeView
    Dim lv As ListView

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        tv = New TreeView
        tv.Dock = DockStyle.Fill
        lv = New ListView
        lv.Dock = DockStyle.Fill
        Dim nd As TreeNode = tv.Nodes.Add("ABC")
        For i As Integer = 1 To 3
            Dim nc As TreeNode = nd.Nodes.Add(nd.Text & i.ToString, nd.Text & i.ToString)
            If i = 2 Then
                nc.ForeColor = Color.Gray
            End If
        Next
        nd.ExpandAll()
        Dim sc As SplitContainer = New SplitContainer
        With sc
            .Panel1.Controls.Add(tv)
            .Panel2.Controls.Add(lv)
            .Dock = DockStyle.Fill
        End With
        Me.Controls.Add(sc)
    End Sub

    Private Sub tv_BeforeSelect(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewCancelEventArgs) Handles tv.BeforeSelect
        If e.Node.ForeColor = Color.Gray Then
            e.Cancel = True
        End If
    End Sub
End Class

Samozřejmě je to nedokonalé, ještě

enabled a disabled ikony, všechny

childnode disabled automaticky je-li

parentnode disabled apod.

...

Chce to vypiplat do vb6 šílenosti. :)

Mnoho zdaru!

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ještě k těm podrobnostem, proč je node

nepřístupné,snad by šlo použít tooltip

nebo jen při najetí myši na node vypsat

podrobnosti do labelu...

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

Díky tento kód funguje tak jak potřebuji:) Snažil jsem se tím inspirovat a udělat si nový objekt který by dědil z treeView a tato funkce by tam byla dopsána. Co se týká objektů tak teprve začínám podle seriálu na tomto webu takže zatím tápu. Prozatím se mi podařilo tuto funkci dopsat do treeNode ale zastavil jsem se na tom, že nevím jak treeView přesvedčit aby nepoužíval standartní treeNode ale aby si vzal to které jsem si vytvořil.Možná na to jdu uplně špatně a pokud zde plácám blbosti tak mě s ohledem na mé objektové začátky prosím pošlete do oněch míst s jistou dávkou tolerance:)

Pokud na něco příjdu dám sem kód.

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

Fajn,že to pomohlo. Skvělý nápad, přidat si

k TreeNode vlastnost Enabled a podstrčit ho

do treeview. Super bude-li kód.

...

Rovněž v začátcích, tedy inspirace je vítána

a kromě té tolerance máte i mé sympatie. :)

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

Dobrý den,

nevíte náhodou, jak nastavit správnou výšku a šířku formuláře, v tomto případě Me, tak aby nebyly potřeba posuvníky? Zkoušel jsem to různě nastavit ale výsledek byl akorát ten, že mi sender předával místo topNodu, firstNode. To má co do činění právě s velikostí formuláře. Ale nevim jestli něco nedělám špatně nebo jestli to neni bug.

Díky,

PetrS

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