PowerShell:按下按钮时 Datagrid 不显示新数据

PowerShell: Datagrid not showing new data when button pressed

我在 Windows.Forms.DataGrid 中使用 PowerShell 来处理 CSV 文件中的数据。下面包含示例代码以复制我的问题。该脚本将生成一个带有数据网格和按钮的基本表单。我只想在每次按下 "add" 按钮时向数据网格添加新行。

目前,单击添加按钮时,会在数据网格中添加一个新行。您可以看到 VMcount 增加以及新数据源内容,但它不会显示在数据网格中。我发现了一些关于 .autogeneratecolumn 的 post 但这个选项在 powershell 中不可用。只是不知道我错过了什么...

Link to screenshot

Function btnVMAdd(){
    Write-Host "Adding Line"
        Write-Host "VM COUNT: $($dtgVMList.DataSource.count) "
        $array = $dtgVMList.DataSource        
        $array | Out-Host
        $dtgVMList.DataSource | Out-Host
        $object = New-Object –TypeName PSObject
        $object | Add-Member –MemberType NoteProperty –Name VMName –Value "new vm"
        $object | Add-Member –MemberType NoteProperty –Name IPAddr –Value "new ip"
        $array.Add($object)
        $dtgVMList.DataSource= $array
}



[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 

#This creates the form and sets its size and position
$objForm = New-Object System.Windows.Forms.Form 
$objForm.Text = "Simple Form"
$objForm.Size = New-Object System.Drawing.Size(600,600) 
$objForm.StartPosition = "CenterScreen"


$gbxVMList = New-Object System.Windows.Forms.GroupBox
$gbxVMList.Location = New-Object System.Drawing.Point(20,20) 
$gbxVMList.size = New-Object System.Drawing.Size(500,500) 
$gbxVMList.text = "VM Deployment List" 
$objForm.Controls.Add($gbxVMList)   

$dtgVMList = New-Object System.Windows.Forms.DataGrid 
$dtgVMList.Location = New-Object System.Drawing.Point(5,15)
$dtgVMList.Size = New-Object System.Drawing.Size(490,300) 
$dtgVMList.DataBindings.DefaultDataSourceUpdateMode = 0 
$dtgVMList.HeaderForeColor = [System.Drawing.Color]::FromArgb(255,0,0,0) 
$dtgVMList.Name = "VMListData" 
$dtgVMList.DataMember = "" 
$dtgVMList.TabIndex = 0 
$dtgVMList.Autog
$gbxVMList.Controls.Add($dtgVMList)



$btnVMAdd = New-Object System.Windows.Forms.Button 
$btnVMAdd.Location = New-Object System.Drawing.Point(150,350) 
$btnVMAdd.Size = New-Object System.Drawing.Size(90,20) 
$btnVMAdd.Text = "Add VM" 
$btnVMAdd.Add_Click({btnVMAdd}) 
$gbxVMList.Controls.Add($btnVMAdd)
$Global:json = @{}
$Global:json | Add-Member -MemberType NoteProperty -Name vmlist -Value ""

$array = New-Object System.Collections.ArrayList

$object = New-Object –TypeName PSObject
$object | Add-Member –MemberType NoteProperty –Name VMName –Value "VM Name"
$object | Add-Member –MemberType NoteProperty –Name IPAddr –Value "IP Addr"


$array.Add($object)
$global:json.vmlist = $array
$dtgVMList.DataSource = $array

$array = $dtgVMList.DataSource
$object = New-Object –TypeName PSObject
$object | Add-Member –MemberType NoteProperty –Name VMName –Value "VM Name2"
$object | Add-Member –MemberType NoteProperty –Name IPAddr –Value "IP Addr"
$array.Add($object)

$dtgVMList.DataSource = $array

$array = $dtgVMList.DataSource
$object = New-Object –TypeName PSObject
$object | Add-Member –MemberType NoteProperty –Name VMName –Value "VM Name3"
$object | Add-Member –MemberType NoteProperty –Name IPAddr –Value "IP Addr"
$array.Add($object)

$dtgVMList.DataSource = $array


$objForm.Add_Shown({$objForm.Activate()})
[void] $objForm.ShowDialog()

我想如果你指定:

$dtgVMList.DataBindings.DefaultDataSourceUpdateMode = 0 

那你必须在赋值后手动刷新绑定:

$dtgVMList.DataSource= $array
$dtgVMList.Refresh

或指定另一种刷新方式。