PowerShell: DataGridView right click selected rows to delete/re-run command

Welcome Forums General PowerShell Q&A PowerShell: DataGridView right click selected rows to delete/re-run command

This topic contains 2 replies, has 3 voices, and was last updated by

 
Participant
1 month, 2 weeks ago.

  • Author
    Posts
  • #114214

    Participant
    Points: 0
    Rank: Member

    I need to be able to right click the selected rows in the DataGrid and delete or re-run the command against the selected rows.

    function Check-Replication {
    
    	#----------------------------------------------
    	#region Import the Assemblies
    	#----------------------------------------------
    	[void][reflection.assembly]::Load('System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089')
    	[void][reflection.assembly]::Load('System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089')
    	[void][reflection.assembly]::Load('System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
    	[void][reflection.assembly]::Load('System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
    	[void][reflection.assembly]::Load('System.ServiceProcess, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
    	#endregion Import Assemblies
    
    	#----------------------------------------------
    	#region Generated Form Objects
    	#----------------------------------------------
    	[System.Windows.Forms.Application]::EnableVisualStyles()
    	$form1 = New-Object 'System.Windows.Forms.Form'
    	$labelTypeEachComputerName = New-Object 'System.Windows.Forms.Label'
    	$textbox1 = New-Object 'System.Windows.Forms.TextBox'
    	$datagridview1 = New-Object 'System.Windows.Forms.DataGridView'
    	$buttonRun = New-Object 'System.Windows.Forms.Button'
    	$Computer = New-Object 'System.Windows.Forms.DataGridViewTextBoxColumn'
    	$Status = New-Object 'System.Windows.Forms.DataGridViewTextBoxColumn'
    	$InitialFormWindowState = New-Object 'System.Windows.Forms.FormWindowState'
    	#endregion Generated Form Objects
    
    	#----------------------------------------------
    	# User Generated Script
    	#----------------------------------------------
    	
    	$FormEvent_Load={
    	}
    	
    	$textbox1_Validated={
    		if($textbox1.Text){
    			$i=$datagridview1.Rows.Add(1)
    			$row=$datagridview1.Rows[$i]
    			$row.SetValues(@($textbox1.Text,'pending'))	
    			$textbox1.Text=''
    			$textbox1.Focus()
    	    }
    	}
    	
    	$buttonRun_Click={
    		$datagridview1.Rows|
    			ForEach-Object{
    				$row=[System.Windows.Forms.DataGridViewRow]$_
    			$CommandResult = Invoke-Command -ComputerName $row.cells[0].Value -ArgumentList $row -ScriptBlock{Param($row)
                Import-Module Hyper-V
        IF ((Get-VM -ErrorAction Stop | Where-Object {$_.name -like '*SR*'} | Get-VMReplication -ErrorAction Stop).Replicationhealth -eq 'critical')
        {
            try{
            Get-VM -ErrorAction Stop | Where-Object {$_.name -like '*SR*'} | Resume-VMReplication -ErrorAction Stop
            IF ((Get-VM -ErrorAction Stop | Where-Object {$_.name -like '*SR*'} | Get-VMReplication -ErrorAction Stop).Replicationhealth -eq 'critical') {throw [System.Exception] "Replicationhealth critical" }
            }
        
            catch{
        
                try{
                Get-VM -ErrorAction Stop | Where-Object {$_.name -like '*SR*'} | Resume-VMReplication -Resynchronize -ErrorAction Stop
                }
        
                catch{
                Return 'FAILED: Resume-VMReplication -Resynchronize'
            BREAK
                }
                Return 'Successful: Resume-VMReplication -Resynchronize'
            BREAK
                }
                Return 'Successful: Resume-VMReplication'
                }
            ELSE
                {
                Return 'Successful: No action replication is NOT critical'
                }
                }
                Switch ($CommandResult){
                "FAILED: Resume-VMReplication -Resynchronize" {$row.Cells |%{$_.Style.BackColor='pink'}
        		$Row.Cells[1].Value = $CommandResult}
                "Successful: Resume-VMReplication -Resynchronize"{$row.Cells |%{$_.Style.BackColor='lightgreen'}
        		$Row.Cells[1].Value = $CommandResult}
                "Successful: Resume-VMReplication"{$row.Cells |%{$_.Style.BackColor='lightgreen'}
        		$Row.Cells[1].Value = $CommandResult}
                "Successful: No action replication is NOT critical"{$row.Cells |%{$_.Style.BackColor='lightgreen'}
        		$Row.Cells[1].Value = $CommandResult}
                }
                
    	    	}
    		$datagridview1.ReadOnly=$true
    	}
    	
    	# --End User Generated Script--
    	#----------------------------------------------
    	#region Generated Events
    	#----------------------------------------------
    	
    	$Form_StateCorrection_Load=
    	{
    		#Correct the initial state of the form to prevent the .Net maximized form issue
    		$form1.WindowState = $InitialFormWindowState
    	}
    	
    	$Form_Cleanup_FormClosed=
    	{
    		#Remove all event handlers from the controls
    		try
    		{
    			$textbox1.remove_Validated($textbox1_Validated)
    			$buttonRun.remove_Click($buttonRun_Click)
    			$form1.remove_Load($FormEvent_Load)
    			$form1.remove_Load($Form_StateCorrection_Load)
    			$form1.remove_FormClosed($Form_Cleanup_FormClosed)
    		}
    		catch { Out-Null  }
    	}
    	#endregion Generated Events
    
    	#----------------------------------------------
    	#region Generated Form Code
    	#----------------------------------------------
    	$form1.SuspendLayout()
    	#
    	# form1
    	#
    	$form1.Controls.Add($labelTypeEachComputerName)
    	$form1.Controls.Add($textbox1)
    	$form1.Controls.Add($datagridview1)
    	$form1.Controls.Add($buttonRun)
    	$form1.AutoScaleDimensions = '6, 13'
    	$form1.AutoScaleMode = 'Font'
    	$form1.ClientSize = '425, 600'
    	$form1.FormBorderStyle = 'FixedDialog'
    	$form1.MaximizeBox = $False
    	$form1.MinimizeBox = $False
    	$form1.Name = 'form1'
    	$form1.StartPosition = 'CenterScreen'
    	$form1.Text = 'Replication Check'
    	$form1.add_Load($FormEvent_Load)
    	#
    	# labelTypeEachComputerName
    	#
    	$labelTypeEachComputerName.Location = '20, 18'
    	$labelTypeEachComputerName.Name = 'labelTypeEachComputerName'
    	$labelTypeEachComputerName.Size = '240, 49'
    	$labelTypeEachComputerName.TabIndex = 5
    	$labelTypeEachComputerName.Text = 'Type each computer name ending with a   it will be added to the list.  Click run when alll have been added.'
    	$labelTypeEachComputerName.UseCompatibleTextRendering = $True
    	#
    	# textbox1
    	#
    	$textbox1.CharacterCasing = 'Upper'
    	$textbox1.Location = '20, 81'
    	$textbox1.Name = 'textbox1'
    	$textbox1.Size = '285, 20'
    	$textbox1.TabIndex = 1
    	$textbox1.add_Validated($textbox1_Validated)
    	#
    	# datagridview1
    	#
    	$datagridview1.AllowUserToAddRows = $False
    	$datagridview1.AllowUserToDeleteRows = $False
    	$datagridview1.AllowUserToResizeColumns = $True
    	$datagridview1.AllowUserToResizeRows = $False
    	$datagridview1.ColumnHeadersHeightSizeMode = 'AutoSize'
    	[void]$datagridview1.Columns.Add($Computer)
    	[void]$datagridview1.Columns.Add($Status)
        $datagridview1.columns[1].Width = '240'
    	$datagridview1.Location = '20, 113'
    	$datagridview1.Name = 'datagridview1'
    	$datagridview1.ReadOnly = $True
    	$datagridview1.Size = '383, 470'
    	$datagridview1.TabIndex = 3
        $datagridview1.DefaultCellStyle.WrapMode = "True"
        #
    	# buttonRun
    	#
    	$buttonRun.Location = '325, 80'
    	$buttonRun.Name = 'buttonRun'
    	$buttonRun.Size = '75, 23'
    	$buttonRun.TabIndex = 2
    	$buttonRun.TabStop = $False
    	$buttonRun.Text = 'Run'
    	$buttonRun.UseCompatibleTextRendering = $True
    	$buttonRun.UseVisualStyleBackColor = $True
    	$buttonRun.add_Click($buttonRun_Click)
    	#
    	# Computer
    	#
    	$Computer.HeaderText = 'Server'
    	$Computer.Name = 'Server'
    	$Computer.ReadOnly = $True
    	#
    	# Status
    	#
    	$Status.HeaderText = 'Status'
    	$Status.Name = 'Status'
    	$Status.ReadOnly = $True
        
    	$form1.ResumeLayout()
    	#endregion Generated Form Code
    
    	#----------------------------------------------
    
    	#Save the initial state of the form
    	$InitialFormWindowState = $form1.WindowState
    	#Init the OnLoad event to correct the initial state of the form
    	$form1.add_Load($Form_StateCorrection_Load)
    	#Clean up the control events
    	$form1.add_FormClosed($Form_Cleanup_FormClosed)
    	#Show the Form
    	return $form1.ShowDialog()
    
    } #End Function
    
    #Call the form
    Check-Replication | Out-Null
    
  • #115182

    Participant
    Points: 809
    Helping Hand
    Rank: Major Contributor

    Your question is just a one liner, we would require more details to help you. why you are doing this ? Did you search for the windows forms .net documentation ?

  • #115210

    Participant
    Points: 306
    Helping Hand
    Rank: Contributor

    You have to change your form code behind to do what you are asking. This is not a PS specific issue.
    So, you are bringing in a dataset as array to populate the datagrid, so, you need to write more code to act on a selected line, thus, you need to ask your code behind to do the remove / re-run effort.

    So, use the normal remove from the in memory array dataset, and refresh and re-run from buttons you provide or event triggers you set.

    Very rough not fully vetted example – just showing the selection code behind:

    $form = New-Object System.Windows.Forms.Form
    $form.Size = New-Object System.Drawing.Size(900,600)
    
    $dataGridView = New-Object System.Windows.Forms.DataGridView
    $dataGridView.Size=New-Object System.Drawing.Size(800,400)
    
    $go = New-Object System.Windows.Forms.Button
    $go.Location = New-Object System.Drawing.Size(300,450)
    $go.Size = New-Object System.Drawing.Size(75,23)
    $go.text = "Select"
    
    $form.Controls.Add($go)
    $form.Controls.Add($dataGridView)
    
    $dataGridView.ColumnCount = 4
    $dataGridView.ColumnHeadersVisible = $true
    $dataGridView.Columns[0].Name = "Name"
    $dataGridView.Columns[1].Name = "ID"
    $dataGridView.Columns[2].Name = "Description"
    $dataGridView.Columns[3].Name = "Memory"
    $dataGridView.Columns[0].width = 240
    
    get-process  |  
    foreach{  $dataGridView.Rows.Add($_.Name,$_.ID,$_.Description,$_.WorkingSet)|out-null }
    $go.Add_Click(
    {
        $selectedRow = $dataGridView.CurrentRow.Index
        write-host $selectedRow
    })
    [void]$form.ShowDialog() 
    

You must be logged in to reply to this topic.