Хобрук: Ваш путь к мастерству в программировании

Как переименовать заголовки динамически созданных элементов TreeView

Я новичок в TreeView в WPF: C#, и я учусь работать с динамически созданным TreeViewItems. Прямо сейчас моя программа позволяет пользователю создавать динамические TreeViewItems, а затем удалять их. В качестве следующего шага я хотел бы запрограммировать возможность переименовывать эти динамические элементы. Теоретически этот процесс не требует пояснений, однако я не знаю, что делать с кодом C#.

Прежде всего, я хотел бы обрисовать свой процесс переименования, чтобы показать, где именно мне нужна помощь.

  1. Пользователь щелкает правой кнопкой мыши на TreeViewItem
  2. contextMenu падает вниз (ГОТОВО)
  3. Пользователь нажимает «Переименовать...», и открывается окно (ГОТОВО)
  4. Имя TreeViewItem внесено в textBox (ГОТОВО)
  5. Если текст в textBox соответствует header в TreeView mainWindow, открывается другое окно, которое позволяет пользователю ввести новое имя для TreeViewItem. (НЕПОЛНЫЙ)
  6. Когда имя вводится в новом окне, пользователь нажимает кнопку ввода, и имя элемента изменяется на то, что было введено в поле textBox. (НЕПОЛНЫЙ)

Вот мой код для шага 5, где программа должна убедиться, что введенное header существует в файле TreeView. В областях, где я не уверен в правильности кода, у меня есть псевдокод.

//ENTER - Select TreeViewItem, open enterName window
private void button2_Click(object sender, RoutedEventArgs e)
{
       //Query for Window1
       var mainWindow = Application.Current.Windows
           .Cast<Window1>()
           .FirstOrDefault(window => window is Window1) as Window1;

       //If(textbox1.text == one of the treeViewItem headers)
       var newWindow = new EnterCartName();
       newWindow.Show();

       //else,
       //MessageBox.Show("Value entered does not match a current cart name");
       //this.Close();
}

Что касается шага 6, я понимаю, как добавить TreeViewItem с динамически созданным header, но я не знаю, как получить и переименовать существующий. Это мой код:

//ENTER - Change cart name
private void button2_Click(object sender, RoutedEventArgs e)
{
       this.Close(); //close Window

       //Query for Window1
       var mainWindow = Application.Current.Windows
           .Cast<Window1>()
           .FirstOrDefault(window => window is Window1) as Window1;

       //mainWindow.treeViewItem.Header(TVI gotten from previous window) = textBox1.Text;
}

Я думаю, что моя главная проблема с динамическими TreeView активами заключается в том, что я чувствую, что они невидимы для меня. Как мне с ними работать, если я не знаю, как они называются и как правильно на них ссылаться. Если вы знаете какие-либо руководства или ресурсы по этой теме, пожалуйста, поделитесь ими.

Большое спасибо.

Мое окончательное решение:

//Now Global
bool hasFoundMatch;

//ENTER - Select cart, open enter name window
private void button2_Click(object sender, RoutedEventArgs e)
{
       string input, output;

       //Query for Window1
       var mainWindow = Application.Current.Windows
           .Cast<Window1>()
           .FirstOrDefault(window => window is Window1) as Window1;

       //Get TreeViewItem from mainWindow
       TreeViewItem renameCart = mainWindow.cartTypes_TI;
       input = textBox1.Text;
       output = textBox2.Text;

       //Check if header exists
       hasFoundMatch = CheckItemHeader(renameCart.Items, input);

       //if header exists - set new header
       //Else - show message box
       if (hasFoundMatch == true)
           SetItemHeader(renameCart.Items, input, output);
       else
           MessageBox.Show("Value entered does not match a current cart name.");

       //close window
       this.Close();
}

//Checks to see whether the user entered header exists
private bool CheckItemHeader(ItemCollection treeViewItems, string input)
{
       bool hasFoundMatch = false;
       for (int index = 0; index < treeViewItems.Count; index++)
       {
           TreeViewItem item = (TreeViewItem)treeViewItems[index];
           string header = item.Header.ToString();

           if(header == input)
           {
                 hasFoundMatch = true;
                 break;
           }
           else
                 hasFoundMatch = false;
       }
       return hasFoundMatch;
}

//Changes the selected TVI header
private void SetItemHeader(ItemCollection treeViewItems, string input, string output)
{
       for (int index = 0; index < treeViewItems.Count; index++)
       {
           TreeViewItem item = (TreeViewItem)treeViewItems[index];
           string header = item.Header.ToString();
           if (header == input)
           {
               item.Header = output;
               break;
           }
       }
}
29.07.2013

Ответы:


1

Ну, настроить заголовок так же просто, как:

treeViewItem.Header = textBox1.Text;

Его поиск должен быть аналогичен поиску соответствия любого TreeViewItem.Header тексту, представленному в TextBox:

private void SetItemHeader(ItemCollection treeViewItems, string input, string output)
{
    for (int index = 0; index < treeViewItems.Count; index++)
    {
        TreeViewItem item = (TreeViewItem)treeViewItems[index];
        if (item.Header == input)
        {
            item.Header = output;
            return;
        }
        else if (item.Items.Count > 1) SetItemHeader(item.Items, input, output);
    }
}

ОБНОВЛЕНИЕ >>>

Вы можете использовать этот метод для проверки заголовков элементов... если он возвращает true, у вас есть совпадение:

private bool CheckItemHeader(ItemCollection treeViewItems, string input)
{
    for (int index = 0; index < treeViewItems.Count; index++)
    {
        TreeViewItem item = (TreeViewItem)treeViewItems[index];
        if (item.Header == input) return true;
        else if (item.Items.Count > 1) return CheckItemHeader(item.Items, input);
    }
    return false;
}

Вы бы использовали его как:

bool hasFoundMatch = CheckItemHeader(treeView.Items, textInputToMatch);

Затем, когда у вас есть значение для изменения заголовка:

SetItemHeader(treeView.Items, textInputToMatch, textToChangeHeaderTo);
29.07.2013
  • Я понимаю, что вы говорите, но этот способ не включает шаг 6 или мое второе окно. Вы предлагаете пользователю вводить как имя TreeViewItem, так и новое имя в одном и том же окне? 29.07.2013
  • Нет, я подумал, что вы могли бы немного отредактировать этот метод для своего метода сопоставления заголовков, а затем использовать его для обновления вашего заголовка. Однако я обновил свой ответ. 29.07.2013
  • Хорошо, я только что обновил свой ответ вашим решением. Однако проверка продолжает возвращаться как ложная (и я определенно ввожу правильное имя). 29.07.2013
  • Вы должны передать ItemCollection из TreeView в метод CheckItemHeader, а не только один TreeViewItem... если только все остальные TreeViewItem не являются его дочерними элементами. Вам придется отладить эти методы, чтобы увидеть, какие элементы передаются... вы единственный, кто может это сделать. 29.07.2013
  • Да, я пропускаю TreeViewItem, потому что хочу иметь дело только с его дочерними элементами. Так что в таком случае я должен отлаживать? 29.07.2013
  • Новые материалы

    Управление DOM для чайников вроде меня
    Одной из первых вещей, которую мы рассмотрели, когда начали изучать Javascript во Flatiron, была модель DOM. Кто он? Чем он занимается? Он больше машина, чем человек? Ну да довольно много. ДОМ..

    Что такое структура данных?
    Структура данных хранит и извлекает данные. Все, что обеспечивает эти две функции, является структурой данных . Период. Вы можете пропустить оставшуюся часть статьи, если ответ..

    мои январские чтения по программированию
    Эрик Эллиот Программирование приложения JavaScript Эл Свейгарт «Автоматизируйте скучные вещи с помощью Python» Прогрессивное веб-приложение Google..

    Создание ассоциаций секвелизации с помощью инструмента командной строки Sequelize
    Sequelize - популярный, простой в использовании инструмент объектно-реляционного сопоставления (ORM) JavaScript, который работает с базами данных SQL. Довольно просто начать новый проект с..

    Искусственный интеллект в юридической отрасли - пример прогнозирования судебных решений с помощью глубокого обучения
    На протяжении всей истории люди полагались на суды, присяжных, королей и королев в отправлении правосудия. Сегодня способность судов обеспечивать справедливое и быстрое правосудие для своих..

    Введение в машинное обучение для обнаружения аномалий (часть 1)
    Тщательно созданный, тщательно спроектированный ресурс для специалистов по данным. Часть 1 Главы 03 из Руководства по машинному обучению для обнаружения аномалий Внимание! Прежде чем вы..

    Начало работы с Pulumi в Digital Ocean
    Цифровой океан (ДО) — отличная альтернатива многим другим поставщикам облачных услуг. DO предоставляет простой и понятный пользовательский интерфейс, упрощающий управление инфраструктурой и..