void FindNextPrev(bool findNext)
        {
            if (IsSearchFieldEmpty())
            {
                return;
            }

            //put the search/replace string into the combo-box (if not already in) to have a 'history' of searches
            AddToHistory(cboFind);
            AddToHistory(cboReplaceBy);

            //find the matching cells
            //remark: finding all cells is probably faster than finding the next cell by using the functions which delivers the visible index (i.e. not an internal index, but what the user sees)
            if (!FindMatches())
            {
                return; //no matches found (respective notification is displayed in FindMatches)
            }
            //sort the list of matching cells with respect of sort-order (next/previous) as well as sort-by (column/row)
            List <List <int> > sortedMatchInfo = new List <List <int> >();

            for (int iUnsorted = 0; iUnsorted < _foundCells.Count; ++iUnsorted)
            {
                KeyValuePair <TreeListColumn, TreeListNode> cellToSortIn = _foundCells.ElementAt(iUnsorted);
                int colToSortIn = GetActiveMainForm().treeList.Columns.IndexOf(cellToSortIn.Key);
                int rowToSortIn = TreeListManager.GetNodeVirtualRow(cellToSortIn.Value);

                List <int> matchInfoToSortIn = new List <int>();
                matchInfoToSortIn.Add(iUnsorted);
                matchInfoToSortIn.Add(colToSortIn);
                matchInfoToSortIn.Add(rowToSortIn);

                int i = 0;
                for (; i < sortedMatchInfo.Count; ++i)
                {
                    int indexYetIn = sortedMatchInfo.ElementAt(i).ElementAt(0);
                    int colYetIn   = sortedMatchInfo.ElementAt(i).ElementAt(1);
                    int rowYetIn   = sortedMatchInfo.ElementAt(i).ElementAt(2);
                    if (findNext && radSearchByColumns.Checked)
                    {
                        if (colYetIn > colToSortIn || (colYetIn == colToSortIn && rowYetIn > rowToSortIn))
                        {
                            break;
                        }
                    }
                    if (findNext && radSearchByRows.Checked)
                    {
                        if (rowYetIn > rowToSortIn || (rowYetIn == rowToSortIn && colYetIn > colToSortIn))
                        {
                            break;
                        }
                    }
                    if (!findNext && radSearchByColumns.Checked)
                    {
                        if (colYetIn < colToSortIn || (colYetIn == colToSortIn && rowYetIn < rowToSortIn))
                        {
                            break;
                        }
                    }
                    if (!findNext && radSearchByRows.Checked)
                    {
                        if (rowYetIn < rowToSortIn || (rowYetIn == rowToSortIn && colYetIn < colToSortIn))
                        {
                            break;
                        }
                    }
                }
                sortedMatchInfo.Insert(i, matchInfoToSortIn);
            }

            //assess the visible indices of the currently focused cell, search it in the list to assess the next/previous cell
            int index = findNext ? 0 : sortedMatchInfo.Count - 1; //focus first/last matching cell if no match or no focus

            if (GetActiveMainForm().treeList.FocusedNode != null && GetActiveMainForm().treeList.FocusedColumn != null)
            {
                int focusedRow    = TreeListManager.GetNodeVirtualRow(GetActiveMainForm().treeList.FocusedNode);
                int focusedColumn = GetActiveMainForm().treeList.Columns.IndexOf(GetActiveMainForm().treeList.FocusedColumn);

                int Criterion1        = radSearchByColumns.Checked ? 1 : 2;
                int Criterion2        = radSearchByColumns.Checked ? 2 : 1;
                int focusedCriterion1 = radSearchByColumns.Checked ? focusedColumn : focusedRow;
                int focusedCriterion2 = radSearchByColumns.Checked ? focusedRow : focusedColumn;
                int prevNextConverter = findNext ? 1 : -1;

                for (int i = 0; i < sortedMatchInfo.Count; ++i)
                {
                    int matchInfoIndex      = sortedMatchInfo.ElementAt(i).ElementAt(0);
                    int matchInfoCriterion1 = sortedMatchInfo.ElementAt(i).ElementAt(Criterion1);
                    int matchInfoCriterion2 = sortedMatchInfo.ElementAt(i).ElementAt(Criterion2);

                    if (matchInfoCriterion1 * prevNextConverter > focusedCriterion1 * prevNextConverter ||
                        (matchInfoCriterion1 == focusedCriterion1 && matchInfoCriterion2 * prevNextConverter > focusedCriterion2 * prevNextConverter))
                    {
                        index = matchInfoIndex;
                        break;
                    }
                }
            }

            //focus next/previous matching cell or first/last if no next/previous match found
            TreeListNode   node   = _foundCells.ElementAt(index).Value;
            TreeListColumn column = _foundCells.ElementAt(index).Key;

            //expand the parent nodes to make the match visible
            for (TreeListNode parentNode = node.ParentNode; parentNode != null; parentNode = parentNode.ParentNode)
            {
                parentNode.Expanded = true;
            }
            node.TreeList.FocusedNode   = node;
            node.TreeList.FocusedColumn = column;
        }