You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法将哈希表添加至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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:47:58