private void OnBtnSearchClicked(object sender, EventArgs e) { txtBranchFilter.CloseDropdown(); if (_searchCriteriaChanged && _searchResult != null && _searchResult.Any()) { _searchCriteriaChanged = false; foreach (var coloredNode in _searchResult) { coloredNode.BackColor = SystemColors.Window; } _searchResult = null; if (txtBranchFilter.Text.IsNullOrWhiteSpace()) { txtBranchFilter.Focus(); return; } } if (_searchResult == null || !_searchResult.Any()) { if (txtBranchFilter.Text.IsNotNullOrWhitespace()) { _searchResult = SearchTree(txtBranchFilter.Text, treeMain.Nodes); } } var node = GetNextSearchResult(); if (node != null) { node.EnsureVisible(); treeMain.SelectedNode = node; } }
private void DoSearch() { _txtBranchCriterion.CloseDropdown(); if (_searchCriteriaChanged && _searchResult != null && _searchResult.Any()) { _searchCriteriaChanged = false; foreach (var coloredNode in _searchResult) { coloredNode.BackColor = SystemColors.Window; } _searchResult = null; if (_txtBranchCriterion.Text.IsNullOrWhiteSpace()) { _txtBranchCriterion.Focus(); return; } } if (_searchResult == null || !_searchResult.Any()) { if (_txtBranchCriterion.Text.IsNotNullOrWhitespace()) { _searchResult = SearchTree(_txtBranchCriterion.Text, treeMain.Nodes.Cast <TreeNode>()); } } var node = GetNextSearchResult(); if (node == null) { return; } node.EnsureVisible(); treeMain.SelectedNode = node; return; TreeNode GetNextSearchResult() { var first = _searchResult?.FirstOrDefault(); if (first == null) { return(null); } _searchResult.RemoveAt(0); _searchResult.Add(first); return(first); } List <TreeNode> SearchTree(string text, IEnumerable <TreeNode> nodes) { var queue = new Queue <TreeNode>(nodes); var ret = new List <TreeNode>(); while (queue.Count != 0) { var n = queue.Dequeue(); if (n.Tag is BaseBranchNode branch) { if (branch.FullPath.IndexOf(text, StringComparison.InvariantCultureIgnoreCase) != -1) { AddTreeNodeToSearchResult(ret, n); } } else { if (n.Text.IndexOf(text, StringComparison.InvariantCultureIgnoreCase) != -1) { AddTreeNodeToSearchResult(ret, n); } } foreach (TreeNode subNode in n.Nodes) { queue.Enqueue(subNode); } } return(ret); } }