WPF. Dodawanie węzła do drzewa reprezentującego strukturę pliku XML, pobieranie indeksu

0

Witam,
W programie który wczytuje plik .xml i wyświetla go w kontrolce treeview chciałbym dodać przyciski, które dodają węzły (parent, child) dla wskazanego węzła w drzewie. Niestety nie do końca wiem jak to jest z tymi indeksami węzłów i mój przycisk jest tylko w stanie dodać węzeł na końcu drzewa.

private void Button_Click(object sender, RoutedEventArgs e)
        {
            int selectedNodeIndex = -1;
            var selected =tv.SelectedItem as TreeViewItem;
            int index = 0;
            foreach (var _item in tv.Items)
            {
                if (_item == tv.SelectedItem)
                {
                    selectedNodeIndex = index;
                    break;
                }
                else
                {
                    
                }
                index++;
            }                
                TreeViewItem newChild = new TreeViewItem();
                newChild.Header = textBox1.Text;
                foreach (var item in tv.Items)
                {
                    _items.Add(item);
                }
                _items.Add(newChild);
                tv.ItemsSource = _items;

Może ktoś podać jakieś wskazówki jak "ugryźć" ten temat? Generalnie chodzi o to żebym po wybraniu węzła w treeview mógł dodać do niego węzeł o poziom niżej lub na tym samym poziomie.
pozdrawiam
marroz28

0

Nie mam pojęcia co robi twój kod.
Pisane na kolanie:

private void Button_Click(object sender, RoutedEventArgs e)
{
    var newItem = new TreeViewItem();
    var selectedItem = treeView.SelectedItem as TreeViewItem;
    //dodanie itemu poziom niżej
    selectedItem.Items.Add(newItem)

    //dodanie itemu na tym samym poziomie
   (selectedItem.Parent as TreeViewItem).Items.Add(newItem)
}
0
  var newItem = new TreeViewItem();
                var selectedItem = tv.SelectedItem as TreeViewItem;
                newItem.Header = textBox1.Text;

            
                foreach (var item in tv.Items)
                {
                    _items.Add(item);
                }

                selectedItem.Items.Add(newItem);

                tv.ItemsSource = _items;
 
0

Co ty tworzysz w ogóle? Wklej cały kod. Skąd mam wiedzieć co to jest _items? W której linijce się wywala?

1

W której linijce wywala błąd?

Co to _items, i czy je tworzysz?

0
namespace XsdToXmlGenerator
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private string _selectedFileName;

        public List<object> _items { get; set; }
       


        public MainWindow()
        {
            InitializeComponent();
            _items = new List<object>();
            
        }
        private void cmdLoadXml_Click(object sender, RoutedEventArgs e)
        {
            // Configure open file dialog box
            Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
            dlg.FileName = "Dokument"; // Default file name
            dlg.DefaultExt = ".xsd"; // Default file extension
            dlg.Filter = "Dokumenty XML Schema(.xsd)|*.xsd"; // Filter files by extension 
            var result = dlg.ShowDialog();

            // Process open file dialog box results 
            if (result == true)
            {
                // Open document 
                _selectedFileName = Path.GetFileNameWithoutExtension(dlg.FileName);

                // _______________________________________________________________________________________
                XmlTextWriter textWriter = new XmlTextWriter(_selectedFileName + ".xml", null);
                textWriter.Formatting = Formatting.Indented;
                XmlQualifiedName qname = new XmlQualifiedName("PurchaseOrder", "http://tempuri.org");
                XmlSampleGenerator generator = new XmlSampleGenerator(dlg.FileName, qname);
                generator.WriteXml(textWriter);
                textWriter.Close();

                XmlDocument doc = new XmlDocument();
                doc.Load(_selectedFileName + ".xml");
            }
            try
            {
                
                    XmlDocument doc = new XmlDocument();
                //    //... and load the file that the user picked
                    doc.Load(_selectedFileName + ".xml");
                    //Use the XDP that has been created as one of the Window's resources ...
                    XmlDataProvider dp = (XmlDataProvider)this.FindResource("xmlDP");
                    //... and assign the XDoc to it, using the XDoc's root.
                    dp.Document = doc;
                    dp.XPath = "*";
                
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        
        
        private void cmdExpandAll_Click(object sender, RoutedEventArgs e)
        {
            tv.Style = (Style)this.FindResource("TV_AllExpanded");
        }

        private void cmdCollapse_Click(object sender, RoutedEventArgs e)
        {
            tv.Style = (Style)this.FindResource("TV_AllCollapsed");
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
          
            
          
                

                var newItem = new TreeViewItem();
                var selectedItem = tv.SelectedItem as TreeViewItem;
                newItem.Header = textBox1.Text;

            
                foreach (var item in tv.Items)
                {
                    _items.Add(item);
                }

                selectedItem.Items.Add(newItem);

                tv.ItemsSource = _items;
        

        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            
            foreach (var item in tv.Items)
            {
                _items.Add(item);
            }

           // _items.Remove(tv.SelectedItem);
             
            int index = tv.Items.IndexOf(tv.SelectedItem);   
            if(index < 0)
               {
                   index  = tv.Items.IndexOf(tv.SelectedItem);
               }    

            if(index > 0)
              {
                   tv.Items.RemoveAt(index);
              } 

            tv.ItemsSource = _items;
            
        }
    }
}
 

w tej wywala:

selectedItem.Items.Add(newItem); 

1 użytkowników online, w tym zalogowanych: 0, gości: 1