wrkoutgeek1970
wrkoutgeek1970

Reputation: 13

PowerShell - DataGridView Windows Form Drag and Drop Issue

Hello StackOverflow members,

Hoping for some guidance with a Windows Form DataGridView Control issue. I've stumbled to create a simple Windows Form-based PowerShell Script that should make use of Drag and Drop Events. The issue that I am facing is that when I load/run the PowerShell Script within PowerShell ISE interface, the drag over event does not seem to function. However, if I run it again (without doing anything else), the drag over event seems to work (I am simply dragging a few Files from File Explorer over and to a DataGridView Form Control).

Here is my code:

<#==============================================+
 |  BEGIN SECTION:  Form Control Declarations.  |
 +==============================================#>

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

# [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
# [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")

[System.Windows.Forms.Application]::EnableVisualStyles()

# Create the "ProjectWise File Replacer" Form Control.
$ProjectWiseFileReplacer = New-Object System.Windows.Forms.Form
$ProjectWiseFileReplacer.ClientSize = New-Object System.Drawing.Point(604,460)
$ProjectWiseFileReplacer.Text = "ProjectWise File Replacer (Version 1.0.0) - By Patel, Greene & Associates, LLC"
$ProjectWiseFileReplacer.TopMost = $True
$ProjectWiseFileReplacer.MinimumSize = $ProjectWiseFileReplacer.ClientSize
$ProjectWiseFileReplacer.FormBorderStyle = 'FixedDialog'
$ProjectWiseFileReplacer.Icon = "C:\PGA\Information Technology\ProjectWise\Administration\PowerShell\Scripts\ProjectWise_Icon.ico"
$ProjectWiseFileReplacer.StartPosition = "CenterScreen"

# Create "Files" Data Grid View Form Control.
$DataGridView_Files = New-Object System.Windows.Forms.DataGridView
$DataGridView_Files.Width = 572
$DataGridView_Files.Height = 213
$DataGridView_Files.ColumnCount = 2
$DataGridView_Files.ColumnHeadersVisible = $True
$DataGridView_Files.Columns[0].Name = "Path and File Name"
$DataGridView_Files.Columns[1].Name = "Status"
$DataGridView_Files.Location = New-Object System.Drawing.Point(16,107)
$DataGridView_Files.SelectionMode = 'FullRowSelect'
$DataGridView_Files.MultiSelect = $False
$DataGridView_Files.TabIndex = 0
$DataGridView_Files.RowHeadersVisible = $False
$DataGridView_Files.AutoSizeColumnsMode = 'Fill'
$DataGridView_Files.AllowUserToAddRows = $False
$DataGridView_Files.AllowUserToDeleteRows = $True
$DataGridView_Files.AllowUserToResizeRows = $False
$DataGridView_Files.ReadOnly = $True
$DataGridView_Files.AllowDrop = $True
$DataGridView_Files.RowTemplate.Height = 17
$DataGridView_Files.ColumnHeadersHeight = 22
$DataGridView_Files.Enabled = $True
$DataGridView_Files.Add_DragDrop($DataGridView_Files_DragDrop)
$DataGridView_Files.Add_DragOver($DataGridView_Files_DragOver)

# Add Form Controls to the "ProjectWise File Replacer" Form.
$ProjectWiseFileReplacer.Controls.AddRange(@($DataGridView_Files))

<#================================================+
 |  BEGIN SECTION:  Declare Form Control Events.  |
 +================================================#>

# "Files" Data Grid View Form Control (Drag Over Event).
$DataGridView_Files_DragOver=[System.Windows.Forms.DragEventHandler]{
    # Files have been selected to drag over the "Files" Data Grid View Form Control.
    If ($_.Data.GetDataPresent([Windows.Forms.DataFormats]::FileDrop))
        {
            # Set Drag Over Event Handler Effect.
            $_.Effect = 'Copy'
        }
    # Files have not been selected to drap over the "Files" Data Grid View Form Control.
    Else
        {
            # Set Drag Over Event Handler Effect.
            $_.Effect = 'None'
        }
}

# "Files" Data Grid View Form Control (Drag Drop Event).
$DataGridView_Files_DragDrop=[System.Windows.Forms.DragEventHandler]{
    # Create a String Array for File Collection.
    $Files = $_.Data.GetData([Windows.Forms.DataFormats]::FileDrop)
    
    # Files have been selected, dragged and dropped.
    If ($Files)
        {
            # Loop through each File within the File Collection.
            ForEach ($File in $Files)
          {
                    # Add File to "Files" Data Grid View Control.
                    [void]$DataGridView_Files.Rows.Add($File,"")
                }
        }
}

<#========================================+
 |  BEGIN SECTION:  Main Body of Script.  |
 +========================================#>

# Display (Show) the "ProjectWise File Replacer" Form Window.
[void]$ProjectWiseFileReplacer.ShowDialog()

Any ideas as to why this won't work the first time I run it?

P.S...I get the same result (of not working as expected) when running the script from outside of the PowerShell ISE program.

Notes:

Upvotes: 1

Views: 533

Answers (1)

Theo
Theo

Reputation: 61068

Move the definitions for $DataGridView_Files_DragOver and $DataGridView_Files_DragDrop above the place where you call on them. Now you are using them when they are not yet defined.

The second time the code runs, they are known and the functionality works.

$DataGridView_Files.Enabled = $True

**Here would be a good spot**

$DataGridView_Files.Add_DragDrop($DataGridView_Files_DragDrop)
$DataGridView_Files.Add_DragOver($DataGridView_Files_DragOver)

Upvotes: 2

Related Questions