PowerShell WinForm中DataGridView无法重定位锚定左上角问题
问题根因
DataGridView固定在左上角无法移动,是代码存在以下几个明确错误导致的:
- 变量名不匹配:实例化的控件对象为
$dataGridView,后续设置位置时错误使用了未定义的$DataGridView1变量,所有位置配置根本没有作用到实际添加到窗体的控件实例上 - 未初始化窗体对象:代码中直接调用
$form的方法、添加控件,但没有创建Form实例,也没有设置窗体初始尺寸 - 属性赋值逻辑错误:
Location属性不支持直接传入字符串,需要传入System.Drawing.Point类型对象;Right是控件的只读计算属性(由Left+Width自动算出),手动赋值不会产生任何效果,同时混用Left、Right、Location属性还会造成布局逻辑冲突 - 默认行为:未设置位置的控件会默认停靠在容器左上角坐标(0,0)位置
修复后可直接运行的代码
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") # 初始化窗体并设置初始尺寸 $form = New-Object System.Windows.Forms.Form $form.Size = New-Object System.Drawing.Size(1200, 700) # 初始化DataGridView $dataGridView = New-Object System.Windows.Forms.DataGridView $dataGridView.Size = New-Object System.Drawing.Size(800,400) # 正确设置控件位置,变量名与实例化对象保持一致 $dataGridView.Location = New-Object System.Drawing.Point(75, 75) # 确认Dock属性为None(默认值即为None,若之前修改过Dock为Fill等样式会导致自定义位置失效) # $dataGridView.Dock = [System.Windows.Forms.DockStyle]::None # 添加控件到窗体 $form.Controls.Add($dataGridView) # 配置DataGridView列 $dataGridView.ColumnCount = 4 $dataGridView.ColumnHeadersVisible = $true $dataGridView.Columns[0].Name = "A" $dataGridView.Columns[1].Name = "B" $dataGridView.Columns[2].Name = "C" $dataGridView.Columns[3].Name = "D" # 添加测试行 $row1 = '1','2','3','4' $dataGridView.Rows.Add($row1) # 弹窗显示 $form.ShowDialog()
额外注意事项
- PowerShell变量名不区分大小写,但名称字符必须完全匹配,后缀多写
1会生成全新的空变量,所有赋值操作都不会作用到目标控件 - 调整WinForm控件位置时,只需要设置
Location(等价于设置Left、Top坐标)和Size属性即可,不要给只读的Right、Bottom属性赋值 - 如果控件开启了Dock停靠(比如设置为DockStyle.Fill、DockStyle.Top等),自定义Location坐标会失效,需要先将Dock设为None才能自由调整位置
- 把控件添加到窗体的操作和设置控件属性的操作没有严格先后顺序,只要属性赋值的目标是正确的控件实例即可生效
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

