4

私はTreeViewWPF: C# の初心者で、動的に作成された を操作する方法を学んでいますTreeViewItems。現在、私のプログラムでは、ユーザーが動的に作成してTreeViewItemsから削除することができます。次のステップとして、これらの動的アイテムの名前を変更する機能をプログラムしたいと考えています。理論的には、このプロセスは自明ですが、C# コードをどうすればよいかわかりません。

まず最初に、名前を変更するプロセスの概要を説明し、助けが必要な場所を正確に示したいと思います。

  1. ユーザーがTreeViewItem
  2. AcontextMenuドロップダウン (完了)
  3. ユーザーが「名前の変更...」をクリックすると、ウィンドウが開きます (完了)
  4. の名前TreeViewItemが​​入力されましたtextBox(DONE)
  5. のテキストがmainWindow のとtextBox一致する場合、別のウィンドウが開き、ユーザーは の新しい名前を入力できます。(不完全な)headerTreeViewTreeViewItem
  6. 名前が新しいウィンドウに入力されると、ユーザーが [Enter] をクリックすると、項目の名前が に入力された名前に変更されtextBoxます。(不完全な)

headerステップ 5 のコードは次のとおりです。プログラムは、入力されたが に存在することを確認する必要があり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 では、動的に作成された を使用してを追加する方法は理解していますが、既存のものを取得して名前を変更する方法がわかりません。これは私のコードです:TreeViewItemheader

//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;
           }
       }
}
4

1 に答える 1

0

ヘッダーの設定は次のように簡単です。

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);
于 2013-07-29T15:11:51.463 に答える