1

In my program I have a tabItemthat gets selected when a TreeViewItemwith an equivalent headeris selected.

这是我目前拥有的(它有效):

(parent_TreeViewItem.Items.Contains(SelectedItem))
{
          tabControl1.SelectedItem = tabControl1.Items //Changes tab according to TreeView
                .OfType<TabItem>().SingleOrDefault(n => n.Header.ToString() == SelectedItem.Header.ToString());
}

与我这次所做的不同之处在于,我选择的tabItem's由 a和 an组成。headerstringinteger

例如:TreeViewItem选中的总是有一个header命名"Arrival"的,但tabItem'sheader会有一个类似的形式"Arrival" + integer。该integer值将来自父节点的header.

对于这个过程,我认为我首先需要获取header父节点的值,因为它包含integer我需要的值。然后,我需要以某种方式修改我上面的代码,以查询带有headerlike,的节点"Arrival" + parentHeader

我该怎么做这样的事情?

谢谢你。

更新

我当前的代码,使用@varocarbas 的答案。我正在使用答案的第一个版本,该版本涉及将 设置integer curNumber为父级的值header。单击“到达”节点时,代码编译但不执行任何操作。

if (parent_TreeViewItem.Items.Contains(SelectedItem.Parent)) //Location - Actions tabs
{
       TreeViewItem parentItem = (TreeViewItem)SelectedItem.Parent;
       int curNumber = getNumber(parentItem.Header.ToString());

       tabControl1.SelectedItem = tabControl1.Items //Changes tab according to TreeView
             .OfType<TabItem>().SingleOrDefault(n => n.Header.ToString() == SelectedItem.Header.ToString() + curNumber.ToString());
}

public static int getNumber(string parentNodeHeader)
{
    int curNumber = 0;
    curNumber = Convert.ToInt32(parentNodeHeader);

    return curNumber;
}

更新 2:因为“到达”节点是我用作父节点的节点的孙子节点,所以我已将if第一行中的语句更改为:

 if (parent_TreeViewItem.Items.Contains(SelectedItem.Parent))
4

1 回答 1

1

首先,您必须获取父节点及其标头中包含的数字:

TreeViewItem parentItem = (TreeViewItem)selectedItem.Parent;
int curNumber = getNumber(parentItem.Header.ToString());

getNumber是一个从父节点标头中的确切位置检索数字的函数。为了编写适当的函数,您必须详细说明这一点;目前,只是基础知识(它提取输入字符串中的所有数字):

private int getNumber(string parentNodeHeader)
{
    int curNumber = 0;

    //Required string-analysis actions
    //Sample functionality: extract all the numbers in the given string
    string outString = "";
    int count = -1;
    do
    {
        count = count + 1;
        Char curChar = Convert.ToChar(parentNodeHeader.Substring(count, 1));
        if (Char.IsNumber(curChar))
        {
            outString = outString + parentNodeHeader.Substring(count, 1);
        }
    } while (count < parentNodeHeader.Length - 1);

    if (outString != "")
    {
        curNumber = Convert.ToInt32(outString);
    }

    return curNumber;
}

然后您必须更新查询以考虑新信息:

 .OfType<TabItem>().SingleOrDefault(n => n.Header.ToString() == selectedItem.Header.ToString() + curNumber.ToString());

更新

上面的函数只是展示了我通常依赖的那种代码;但是对于简单的情况(例如建议将所有数字放在一个字符串中),您可能更喜欢依赖Regex,正如 Viv 所建议的那样。您可能会依赖以下内容:

private int getNumber(string parentNodeHeader)
{
    System.Text.RegularExpressions.Match m = System.Text.RegularExpressions.Regex.Match(parentNodeHeader, @"\d+");
    return Convert.ToInt32(m.Value);
}

这个函数只传递它找到的第一组连续数字;结果与上述函数不同,但足以作为概念证明(此答案的意图)。

于 2013-08-21T15:55:48.360 回答