Click here to Skip to main content
15,923,689 members
Please Sign up or sign in to vote.
5.00/5 (1 vote)
See more:
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 


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
Posted
Updated 14-Jun-18 19:37pm
v2

1 solution

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

C
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?
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900