Вопрос по treeview, tabcontrol, wpf, c# – Как выбрать TabItem на основе его заголовка

1

В моей программе у меня естьtabItem который выбирается, когдаTreeViewItem с эквивалентнымheader выбран.

Вот что у меня сейчас (работает):

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

Разница с тем, что яя делаю на этот раз, что этоtabItemheader что я'м выбор состоит изstring иinteger

Например:TreeViewItem выбранный всегда будет иметьheader названный"Arrival", но этоtabItemheader будет иметь такую форму"Arrival" + integer,integer значение будет исходить из родительского узла.header

Для этого процесса яя думаю, что ясначала нужно получитьheader значение родительского узла, так как он содержитinteger значение мне нужно. Затем я'Мне нужно как-то изменить мой код выше, чтобы запросить узел сheader лайк, ."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().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))
Там будет более одного номера. Как тамs вкладка прибытия для нескольких мест. Eric after dark
Поэтому вместо использованияn.Header.ToString() = ... почему бы не использоватьString.StartsWith (), Что-то вродеn.Header.ToString().StartsWith(SelectedItem.Header.ToString()) Viv
Есть ли разные?Прибытие» + номер? То есть вам нужно знать точное число илиПрибытие» это единственный важный бит? varocarbas

Ваш Ответ

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());
</tabitem>

ОБНОВИТЬ

Вышеприведенная функция просто показывает вид кода, на который я обычно полагаюсь; но для простых ситуаций (например, предлагаемого получения всех чисел в строке), вы можете предпочестьRegexВ соответствии с предложением Viv. Вы можете положиться на что-то вроде:

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

Эта функция доставляет только первый набор последовательных чисел, которые она находит; другой результат, чем функция выше, но достаточно для доказательства концепции (намерение этого ответа).

@varocarbas Я думаю, я понял, в чем проблема. Ваш код работает, но родительский узел, который я проверяю на "Прибытие» узел на самом деле является прародителем "Прибытие» узел. Я думал, что независимо от уровня потомка, пока узел является связанным потомком, он будет "содержал» любым родителем выше этого. Это'сейчас работает. Благодарю. Я сделал еще одно обновление в моем вопросе, если выЯ хотел бы проверить это. Eric after dark
@varocarbas Пожалуйста, посмотрите на мой вопрос. Я'мы реализовали первую версию вашего ответа, но это не такЯ не произвожу никаких изменений, что меня смущает, потому что, похоже, все правильно. Должен ли я отказаться от него и использовать новыйgetNumber функционировать? Eric after dark
Должен ли работать тот, что в обновлении в моем вопросе? Потому что если этоЯ собираюсь пройти отладкуЯ предпочитаю придерживаться этого из-за простоты. Eric after dark
@Ericafterdark Добро пожаловать и спасибо, что сообщили мне об этом. varocarbas

Похожие вопросы