双击所选行不会多次创建树 [英] Double click on selected row does not create tree for more than once

查看:56
本文介绍了双击所选行不会多次创建树的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

系统只生成第一个选定行的树视图

System only generate treeview for first selected row like this

ProcessName
         Module
            SubModule
         Thread
            SubThread



但我想如果用户再次选择一个行系统生成另一个这样的树等等


But I want if user again select a row system generate another tree like this and so on

ProcessName1
         Module
            SubModule
         Thread
            SubThread
ProcessName2
         Module
            SubModule
         Thread
            SubThread 





我尝试了什么:



我创建了一个有两个的表第一列包含进程名称,第二列包含进程ID。当用户点击任何行时,用户在另一个面板中为该行创建树

这是所选行的事件处理程序代码



What I have tried:

I have create a table that has two column one contain name of processes and second contain ID of processes. When user click on any row user create tree for that row in another panel
This is code of event handler for row selected

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;

                }
            }





这是表格的代码



This is the code for table

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



我不知道该怎么做。请指导我错误的地方


I don't know what to do. Kindly guide me where I am wrong

推荐答案

我在代码中看到的一个明显问题是您将列表分配给树的行 - 在这里除非你添加条目(而不是仅仅分配它们),否则任何时候都只能有一个列表(参见最后几行):



One 'obvious' problem I can see in your code is the line in which you assign the list to the tree - here you can have only one list at any time unless you add entries (instead of just assigning them) like so (see last couple of lines):

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





这样做吗解决你的问题?如果没有,请更详细地说明您的问题。在代码中设置断点并调试其行为。当您第二次双击某个条目时,在哪里可以使用调试器获取代码?



Does this solve your problem? If not please specifiy your problem in more detail. set a breakpoint in your code and debug its behavior. Where do you get within your code with the debugger when you double click an entry for the 2nd time?


这篇关于双击所选行不会多次创建树的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆