2016-11-07 69 views
2

我有一个WinForm树形视图(属性名为“tvwAcct”),我希望能够通过给定字符串搜索所有现有节点(“ txtName.Text“),并且如果它已经存在,给用户一个消息框警告以停止重复条目。它需要能够搜索所有父节点和子节点。我的当前树结构如下:如何搜索所有节点(包括子节点)

银行帐户名称

- >子账户名1

- >子账户名称2

- >子账户名称3

我已经看过MSDN.Microsoft并且可以看到Nodes.Find实现方法具d存在。

这里是我的代码:

Private Sub txtName_Validating(eventSender As Object, eventArgs As CancelEventArgs) Handles txtName.Validating 
    Dim Cancel As Boolean = eventArgs.Cancel 
    Dim b As Boolean = True 

    ' [ other 'if' conditions here ] 

    ElseIf (tvwAcct.Nodes.Find(txtName.Text, b) Then 
     MyMsgBox("Sorry, this account name already exists. Please try again with a different name.", MsgBoxStyle.Information) 
     Cancel = True 

有了这个代码,我得到它说的错误消息:类型树节点()的

值不能转换为“布尔”。

我将愿意这样做,如果这是行不通的,如获取节点文本值,然后把这些成一个数组列表和查询数组列表,而不是另一种方式。但我没有足够的经验知道如何做到这一点。

有没有人知道我哪里出错了?或者可以提供更好的解决方案?

回答

3

TreeView.Nodes.Find函数返回一个节点数组,而不是真/假值。

试试这样说:

ElseIf tvwAcct.Nodes.Find(txtName.Text, b).Length > 0 Then 
+0

感谢您的支持!我现在没有收到任何错误信息,这很棒。然而,在测试过程中,当我点击'完成'按钮时,重复的节点仍然被添加并保存到TreeView,尽管此修复。我的逻辑正确吗? – greenTree

+0

@Pepsi_Max您没有显示足够的代码。您需要防止节点被添加到TreeView中。 – LarsTech

1

查找方法,通过节点的密钥不是文本搜索。所以,如果你需要通过文本搜索你的节点,你将需要实现你自己的方法。我更喜欢使用LINQ执行此类任务,但它可能不是最佳解决方案:

Dim treeNodes = tvwAcct.Nodes.Cast(Of TreeNode).Where(Function(x) x.Text = txtName.Text).ToArray 


If treeNodes.Length > 0 Then 
    MessageBox.Show("Sorry, this account name already exists. Please try again with a different name.") 
    Cancel = True 
End If