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
5 svar · 267 visningar · startad av Andreas L
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..
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
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.
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.
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
Lösningen var att istället kontrollera "Is Nothing"
Då fungerade det fint (om någon annan skulle dyka på samma problem)