簡體   English   中英

如何重命名動態創建的TreeView項的標頭

[英]How to rename headers of dynamically created TreeView Items

我是WPF中的TreeView新手:C#,我正在學習如何使用動態創建的TreeViewItems 現在,我的程序允許用戶創建動態TreeViewItems然后刪除它們。 對於我的下一步,我想編寫重命名這些動態項的功能。 從理論上講,這個過程非常自我解釋,但是,我不知道如何處理C#代碼。

首先,我想概述一下我的重命名過程,以准確顯示我需要幫助的地方。

  1. 用戶右鍵單擊TreeViewItem
  2. contextMenu下降(DONE)
  3. 用戶點擊“重命名...”並打開一個窗口(完成)
  4. TreeViewItem名稱輸入到textBox (DONE)
  5. 如果textBox中的textBox與mainWindow的TreeView中的header匹配,則會打開另一個窗口,允許用戶輸入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步,我了解如何使用動態創建的header 添加 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;
           }
       }
}

設置標題很簡單:

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM