Member 13688663 Ответов: 1

Двойной щелчок по выбранной строке не создает дерево более одного раза


Система генерирует только treeview для первой выбранной строки, как это
ProcessName
         Module
            SubModule
         Thread
            SubThread

Но я хочу, чтобы если пользователь снова выберет систему строк, то сгенерировал другое дерево, подобное этому, и так далее
ProcessName1
         Module
            SubModule
         Thread
            SubThread
ProcessName2
         Module
            SubModule
         Thread
            SubThread 


Что я уже пробовал:

Я создал таблицу, которая имеет два столбца, один из которых содержит имя процессов, а второй-идентификатор процессов. Когда пользователь нажимает на любую строку пользователь создает дерево для этой строки в другой панели
Это код обработчика событий для выбранной строки
private void Row_DoubleClick(object sender, MouseButtonEventArgs e)
        {
            DataGridRow row = sender as DataGridRow;
            // Some operations with this row
            if (row != null)
            {
                var item = row.DataContext as Processes;
                if (item != null)
                {
                    int id = item.ID;
                    var subModules = new List<ITreeNode>();
                    var subThreads = new List<ITreeNode>();
                    for (int i = 0; i <= 3; i++)
                    {
                        subThreads.Add(new SubThread { Name = "subthread" + i });
                    }
                    var nodes = new List<ITreeNode>
        {
            new Thread { Name = "Thread ", ChildNodes = subThreads },
            new Module { Name = "Module ", ChildNodes = subModules }
        };
                    var runprocesses = new List<RunProcesses>();
                    Process myProcess = Process.GetProcessById(id);
                    ProcessModule myProcessModule;
                    //Get all the modules associated with 'myProcess".
                    ProcessModuleCollection myProcessModuleCollection = myProcess.Modules;
                    for (int i = 0; i < myProcessModuleCollection.Count; i++)
                    {
                        myProcessModule = myProcessModuleCollection[i];
                        string s = myProcessModule.FileName;
                        if (i == 1)
                        {
                            runprocesses.Add(new RunProcesses { Name = myProcessModule.FileName, ChildNodes = nodes });
                        }

                        subModules.Add(new SubModule { Name = s });
                        //Console.WriteLine("The moduleName is " + myProcessModule.ModuleName);
                    }

                    TreeView.ItemsSource = runprocesses;

                }
            }


Это код для таблицы
<pre><Grid>
                            <DataGrid Name="dg" AutoGenerateColumns="False"
                  ItemsSource="{Binding Processes}" SelectionMode="Extended" >
                               
                                <DataGrid.Columns>
                                    <DataGridTextColumn  Binding="{Binding ID}" Header="PID" Width="100"  />
                                    <DataGridTextColumn Binding="{Binding ProcessName}" Header="Process" Width="150"  />
                                </DataGrid.Columns>
                            </DataGrid>
                        </Grid>

Я не знаю, что делать. Будь добр, укажи мне, где я ошибаюсь.

1 Ответов

Рейтинг:
2

Dirk Bahle

Одна "очевидная" проблема, которую я вижу в вашем коде, - это строка, в которой вы назначаете список дереву-здесь у вас может быть только один список в любое время, если вы не добавляете записи (вместо того, чтобы просто назначать их), как это (см. последние пару строк):

private void Row_DoubleClick(object sender, MouseButtonEventArgs e)
{
            DataGridRow row = sender as DataGridRow;
            // Some operations with this row
            if (row != null)
            {
                var item = row.DataContext as Processes;
                if (item != null)
                {
                    int id = item.ID;
                    var subModules = new List<ITreeNode>();
                    var subThreads = new List<ITreeNode>();
                    for (int i = 0; i <= 3; i++)
                    {
                        subThreads.Add(new SubThread { Name = "subthread" + i });
                    }
                    var nodes = new List<ITreeNode>
			        {
			            new Thread { Name = "Thread ", ChildNodes = subThreads },
			            new Module { Name = "Module ", ChildNodes = subModules }
			        };
                    
                    var runprocesses = new List<RunProcesses>();
                    Process myProcess = Process.GetProcessById(id);
                    ProcessModule myProcessModule;
                    //Get all the modules associated with 'myProcess".
                    ProcessModuleCollection myProcessModuleCollection = myProcess.Modules;
                    for (int i = 0; i < myProcessModuleCollection.Count; i++)
                    {
                        myProcessModule = myProcessModuleCollection[i];
                        string s = myProcessModule.FileName;
                        if (i == 1)
                        {
                            runprocesses.Add(new RunProcesses { Name = myProcessModule.FileName, ChildNodes = nodes });
                        }

                        subModules.Add(new SubModule { Name = s });
                        //Console.WriteLine("The moduleName is " + myProcessModule.ModuleName);
                    }

                    // Create new root entry or add to existing entry
                    if (TreeView.ItemsSource != null)
                    	TreeView.ItemsSource = runprocesses;
                    else
					{
						var root = TreeView.ItemsSource as List<RunProcesses>;
						
						if (root != null) // Add into existing list of running processes
						{
							foreach (item in runprocesses)
							{
								root.Add(item);
							}
						}
                    }
                }
            }


Это решает вашу проблему? Если нет, пожалуйста, укажите вашу проблему более подробно. установите точку останова в коде и отладьте его поведение. Что вы получаете в своем коде с отладчиком, когда дважды щелкаете запись во 2-й раз?