如何根据它的标题选择一个TabItem
在我的程序中,我有一个tabItem
,当选择具有等效header
的TreeViewItem
时,它会被选中。
这就是我现在拥有的(它有效):
(parent_TreeViewItem.Items.Contains(SelectedItem)) { tabControl1.SelectedItem = tabControl1.Items //Changes tab according to TreeView .OfType().SingleOrDefault(n => n.Header.ToString() == SelectedItem.Header.ToString()); }
与我这次正在做的事情的不同之tabItem
在于我选择的tabItem
的header
由一个string
和一个integer
。
例如:选中的TreeViewItem
将始终具有名为"Arrival"
的header
,但tabItem
的header
将具有"Arrival" + integer
。 integer
数值将来自父节点的header
。
对于这个过程,我认为我首先需要获取父节点的header
值,因为它包含我需要的integer
数值。 然后我需要修改上面的代码以查询具有header
的节点,如"Arrival" + parentHeader
。
我该怎么办?
谢谢。
UPDATE
我目前的代码,使用@ 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().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:因为“Arrival”节点是我用作父节点的节点的孙子,所以我将第一行中的if
语句更改为:
if (parent_TreeViewItem.Items.Contains(SelectedItem.Parent))
首先,您必须获取父节点和其标头中包含的数字:
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().SingleOrDefault(n => n.Header.ToString() == selectedItem.Header.ToString() + curNumber.ToString());
UPDATE
上面的函数只显示了我通常依赖的代码类型; 但是对于简单的情况(比如建议在字符串中获取所有数字),您可能更喜欢依赖于Viv所建议的Regex
。 您可能会依赖以下内容:
private int getNumber(string parentNodeHeader) { System.Text.RegularExpressions.Match m = System.Text.RegularExpressions.Regex.Match(parentNodeHeader, @"\d+"); return Convert.ToInt32(m.Value); }
此函数仅提供它找到的第一组连续数字; 与上述function不同的结果,但足以作为概念certificate(这个答案的意图)。