无法将哈希表添加至DataGrid,PowerShell新手求助
解决PowerShell DataGrid不显示自定义对象数据的问题
嘿,我来帮你拆解下问题所在!作为PowerShell新手,第一次用WinForms控件确实容易踩坑,咱们一步步来修正:
核心问题分析
你的代码里有两个关键错误,直接导致DataGrid没显示数据:
1. 错误地把自定义对象集合当成哈希表遍历
$Hold是你用New-Object创建的自定义对象数组,不是哈希表,所以$Hold.keys这个写法完全不对——自定义对象根本没有keys属性,这会导致遍历逻辑根本没执行。
2. DataGrid未预先定义列
即使你正确添加了行数据,如果DataGrid没有对应的列,控件也不知道要渲染哪些字段,最终还是会显示空白。
修正后的完整代码
我把你的代码调整后,加上了必要的控件初始化和列定义,你可以直接测试:
# 先加载WinForms程序集(避免控件初始化报错) Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing # 初始化窗体和DataGrid控件 $form = New-Object System.Windows.Forms.Form $form.Text = "Azure 订阅列表" $form.Size = New-Object System.Drawing.Size(800, 400) $datagrid = New-Object System.Windows.Forms.DataGridView $datagrid.Dock = [System.Windows.Forms.DockStyle]::Fill # 给DataGrid添加对应列(必须和自定义对象的属性名匹配) $datagrid.Columns.Add("SrNoColumn", "Sr. No") $datagrid.Columns.Add("SubIDColumn", "Subscription ID") $datagrid.Columns.Add("SubNameColumn", "Name") # 获取Azure订阅数据并构建自定义对象集合 $Subs = Get-AzureRMSubscription if (-not $Subs) { Write-Warning "没有获取到Azure订阅数据,请先确认已用Connect-AzureRmAccount登录!" return } $counter = 1 $Hold = foreach($Sub in $Subs) { # 用更简洁的PSCustomObject创建自定义对象(替代New-Object) [PSCustomObject]@{ "Sr. No" = $counter "Subscription ID" = $Sub.ID "Name" = $Sub.Name } $counter++ } # 正确遍历自定义对象集合,添加行数据 foreach($item in $Hold) { $datagrid.Rows.Add($item.'Sr. No', $item.'Subscription ID', $item.Name) } # 将DataGrid添加到窗体并显示 $form.Controls.Add($datagrid) $form.ShowDialog()
额外小提示
- 先单独执行
Get-AzureRMSubscription确认能返回数据,如果没有结果,要先确保你已经用Connect-AzureRmAccount完成Azure账户登录。 - 用
[PSCustomObject]创建自定义对象比New-Object更直观简洁,后续维护代码也更方便。
内容的提问来源于stack exchange,提问作者in.sane.prasain
相关产品推荐
相关产品推荐

