PowerShell — проблема с перетаскиванием Windows-формы DataGridView

#forms #powershell

#формы #powershell

Вопрос:

Привет, участники StackOverflow,

Надеюсь на некоторые рекомендации по проблеме с управлением Windows Form DataGridView. Я наткнулся на создание простого сценария PowerShell на основе Windows Form, который должен использовать события перетаскивания. Проблема, с которой я сталкиваюсь, заключается в том, что когда я загружаю / запускаю сценарий PowerShell в интерфейсе PowerShell ISE, событие перетаскивания, похоже, не работает. Однако, если я запускаю его снова (не делая ничего другого), событие перетаскивания, похоже, работает (я просто перетаскиваю несколько файлов из проводника в элемент управления формой DataGridView).

Вот мой код:

 <#============================================== 
 |  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 amp; Associates, LLC"
$ProjectWiseFileReplacer.TopMost = $True
$ProjectWiseFileReplacer.MinimumSize = $ProjectWiseFileReplacer.ClientSize
$ProjectWiseFileReplacer.FormBorderStyle = 'FixedDialog'
$ProjectWiseFileReplacer.Icon = "C:PGAInformation TechnologyProjectWiseAdministrationPowerShellScriptsProjectWise_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()
  

Есть идеи относительно того, почему это не сработает при первом запуске?

P.S … я получаю тот же результат (не работает должным образом) при запуске скрипта извне программы PowerShell ISE.

Примечания:

  • Windows 10 Pro (64-разрядная версия)
  • Запуск скрипта в 64-разрядном режиме.

Ответ №1:

Переместите определения для $DataGridView_Files_DragOver и $DataGridView_Files_DragDrop выше места, где вы их вызываете. Теперь вы используете их, когда они еще не определены.

Во второй раз, когда выполняется код, они известны, и функциональность работает.

 $DataGridView_Files.Enabled = $True

**Here would be a good spot**

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

Комментарии:

1. @wrkoutgeek1970 Я рад это слышать. Будучи новичком в платформе, вы можете этого не знать, но обычно принято принимать ответ, который решил вашу проблему, щелкнув значок галочки слева.

2. А, попался! Спасибо за этот совет. Я принял ваш ответ. Еще раз спасибо за вашу помощь сегодня.