webForumDet fria alternativet

VB.net treeview

5 svar · 267 visningar · startad av Andreas L

Andreas LMedlem sedan sep. 2000215 inlägg
#1

Hejsan!

Nybörjare inom vb.net men har som mål att bygga bra gränssnitt till databaser, vilket jag har mer erfarenhete ifrån.

Håller på och labbar med treeview och hur man flyttar runt värden mellan olika sådana objekt. Har dock ett litet problem.

här är en snutt av den kod jag använder, och den fungerar så länge jag använder OnErrorResumeNext. Det vill jag ju egentligen inte göra, utan vad jag vill, är att kontrollera om det finns något värde

    Public Sub TreeView_DragDrop(ByVal sender As Object, _
                                  ByVal e As DragEventArgs) _
                                  Handles TreeView2.DragDrop, TreeView1.DragDrop, TreeView3.DragDrop
        On Error Resume Next
        Dim NewNode As TreeNode
        If e.Data.GetDataPresent("System.Windows.Forms.TreeNode", False) Then
            Dim pt As Point
            Dim DestinationNode As TreeNode

            pt = CType(sender, TreeView).PointToClient(New Point(e.X, e.Y))
            DestinationNode = CType(sender, TreeView).GetNodeAt(pt)
            NewNode = CType(e.Data.GetData("System.Windows.Forms.TreeNode"), _
                                            TreeNode)

            If Len(DestinationNode.Text) < 1 Then 'KOLLA HÄR!!!
                CType(sender, TreeView).Nodes.Add(NewNode.Clone)
            Else

                DestinationNode.Nodes.Add(NewNode.Clone)
                DestinationNode.Expand()
            End If
            
            'Remove original node
            NewNode.Remove()

        End If
    End Sub

Jag vill kontrollera om det finns något textvärde hos "DestinationNode.Text", och den returnerar strängen OM det finns något. Om det däremot inte finns något, så genereras tydligen ett fel, och jag tvingas köra On error Resume Next för att kunna fullfölja koden...

Frågan... Hur kollar jag ifall jag inte får något värde ifrån DestinationNode.Text, utan att ett fel genereras?

Tydligen kan jag inte köra med IsNull, för då blir det kompileringsfel..

renholmMedlem sedan apr. 20012 266 inlägg
#2

C#:

if (DestinationNode.Text != null)
   // skriv ut eller hitta på något annat kreativt.

i VB satsar jag på:

If Not DestinationNode.Text = Nothing Then

eller

If Not DestinationNode.Text Is Nothing Then
Andreas LMedlem sedan sep. 2000215 inlägg
#3

Tack för snabbt svar, tyvärr så kvarstår problemet.

När jag skriver ut felmeddelandet så står det:
"Object reference not set to an instanse of an object"

Detta inträffar ju för att den inte får någon referens vid:

DestinationNode = CType(sender, TreeView).GetNodeAt(pt)

och så blir det fel när jag sedan försöker kontrollera ett värde hos den.

Jag antar att jag egentligen vill kontrollera om den har någon objektreferens, men jag vet inte hur jag skall göra det? Tydligen så är det inte nullvärde som jag skall kontrollera.

renholmMedlem sedan apr. 20012 266 inlägg
#4

Troligen är hela DestinationNode null, därav kan du inte få ut något värde ur .Text och dyl. Kontrollera att du verkligen skapar/pekar den mot en instans.

Andreas LMedlem sedan sep. 2000215 inlägg
#5

Jo, det är helt sant som du säger, problemet är att jag inte vet HUR jag skall kolla det, för det fungerar inte med att kontrollera Nullvärde(vilket jag hade hoppats på), etc.

Allt fungerar fint när jag drar värden mellan träden, så länge det redan finns en nod där.
Problemet är att jag vill kunna lägga till nya värden i trädet, även om det skulle vara helt tomt på värden i början.

Alltså, som det är nu så kollar ju koden om jag släpper värdet på någon befintlig nod, och lägger isåfall till det nya värdet som en "child".
Jag vill kunna lägga till nya där även om trädvyn skulle vara tom. Det är inga problem i sig, utan problemet uppstår när jag skall kontrollera ifall det nya värdet släpps på en befintlig nod, eller ifall den inte finns någon sådan och det skall skapas en ny "Parent".

Ett annat sätt att uttrycka det är att helt enkelt säga:
Ifall det inte finns någon destinationsnod så skall man skapa en helt ny nod, utifrån namnet på kontrollen:

IF -Finns det ingen befintlig nod?- 'kolla utan att generera fel.
Skapa en ny nod i "Treeview2"
ELSE
Lägg till en nod under "Destinationsnoden"
END IF

...men hur fasen kollar man om ifall det saknas en destination, utan att programmet skall generera ett fel?
Det fungerar fint om jag lägger till "On error resume next", men det är ju inte någon bra förutsättning för att konstruera program... :l

Är själv nybörjare, så antagligen finns det någon enkel lösning?!

(här är koden i sin helhet)

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim ParentNode1 As TreeNode
        Dim ParentNode2 As TreeNode
        Dim ParentNode3 As TreeNode

        ParentNode1 = TreeView1.Nodes.Add("tv1")
        With ParentNode1
            .Nodes.Add("tv1FirstChild")
            .Nodes.Add("tv1SecondChild")
            .Nodes.Add("tv1ThirdChild")
            .Nodes.Add("tv1FourthChild")
            .Expand()
        End With
        ParentNode2 = TreeView2.Nodes.Add("tv2")
        With ParentNode2
            .Nodes.Add("tv2FirstChild")
            .Nodes.Add("tv2SecondChild")
            .Expand()
        End With
        ParentNode3 = TreeView3.Nodes.Add("tv3")

    End Sub

    Public Sub TreeView_ItemDrag(ByVal sender As Object, ByVal e As ItemDragEventArgs) _
                        Handles TreeView1.ItemDrag, TreeView2.ItemDrag, TreeView3.ItemDrag
        DoDragDrop(e.Item, DragDropEffects.Move)
    End Sub

    Public Sub TreeView_DragEnter(ByVal sender As Object, _
                               ByVal e As DragEventArgs) _
                               Handles TreeView2.DragEnter, TreeView1.DragEnter, TreeView3.DragEnter
        e.Effect = DragDropEffects.Move
    End Sub

    Public Sub TreeView_DragDrop(ByVal sender As Object, _
                                  ByVal e As DragEventArgs) _
                                  Handles TreeView2.DragDrop, TreeView1.DragDrop, TreeView3.DragDrop
        'On Error Resume Next (skall inte behövas)
        Dim NewNode As TreeNode
        If e.Data.GetDataPresent("System.Windows.Forms.TreeNode", False) Then
            Dim pt As Point
            Dim DestinationNode As TreeNode

            pt = CType(sender, TreeView).PointToClient(New Point(e.X, e.Y))
            DestinationNode = CType(sender, TreeView).GetNodeAt(pt)
            
            NewNode = CType(e.Data.GetData("System.Windows.Forms.TreeNode"), TreeNode)

            If Len(DestinationNode.Text) < 1 Then
               'If Err.Number <> 0 Then MsgBox(Err.Description)
                CType(sender, TreeView).Nodes.Add(NewNode.Clone)
            Else
                DestinationNode.Nodes.Add(NewNode.Clone)
                DestinationNode.Expand()
            End If
            'Remove original node
            NewNode.Remove()
        End If
    End Sub
Andreas LMedlem sedan sep. 2000215 inlägg
#6

Lösningen var att istället kontrollera "Is Nothing"

Då fungerade det fint (om någon annan skulle dyka på samma problem)

136 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)