forms - PowerShell - DataGridView Windows 窗体拖放问题
问题描述
您好 StackOverflow 成员,
希望获得有关 Windows 窗体 DataGridView 控件问题的一些指导。我无意中创建了一个简单的基于 Windows 窗体的 PowerShell 脚本,该脚本应该使用拖放事件。我面临的问题是,当我在 PowerShell ISE 界面中加载/运行 PowerShell 脚本时,拖动事件似乎不起作用。但是,如果我再次运行它(不做任何其他事情),拖动事件似乎起作用(我只是将一些文件从文件资源管理器拖到 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 & 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()
关于为什么我第一次运行它不起作用的任何想法?
PS..从 PowerShell ISE 程序外部运行脚本时,我得到相同的结果(未按预期工作)。
笔记:
- Windows 10 专业版(64 位)
- 在 64 位模式下运行脚本。
解决方案
将定义移动到您调用它们的位置$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)
推荐阅读
- networking - 打开堆栈 Octavia 资源超出配额并失败
- reactjs - react 如何集成多种类型的搜索功能
- audio - FFMPEG 作品封面图片未设置
- c++ - 如果我在运行时强制冲突表达式之间的“发生在”关系,这是否是一场数据竞赛?
- java - 将指标推送到 pushgateway 替换旧的指标
- android - 可以设置 Snapdragon Android 模拟器处理器吗?
- html - 在片段中使用图像时,图像会显示在某些页面上,但不会显示在其他页面上。为什么?
- sql - 匹配同一表中的 2 个 SQL 列,然后将值设置为新列
- sql - 查找破坏组的列 - 在 SQL 组中
- wordpress - WordPress ajax 成功登录但未设置当前用户?