PowerShell中DataGridViewComboBoxColumn列如何显示行默认值
问题修复方案
核心错误为DataGridViewComboBoxColumn的DataPropertyName属性赋值错误,导致下拉列无法与后台数据表字段绑定,无法自动匹配默认值,以下是修正后的完整可运行代码:
Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing $DataTable1 = New-Object System.Data.DataTable $ServiceList = Get-Service # 过滤非值类型/字符串类型属性,避免下拉框显示异常 $grid_column_list = $ServiceList[0] | Get-Member -MemberType Property | Where-Object { $_.Definition -match '^string|^bool|^enum|^int' } $ColumnDropdownDataTableList = [array]::CreateInstance([System.Data.DataTable], $grid_column_list.Count) $DataGridViewComboBoxColumnList = [array]::CreateInstance([System.Windows.Forms.DataGridViewComboBoxColumn], $grid_column_list.Count) ForEach ($grid_column in $grid_column_list) { $colIndex = $grid_column_list.IndexOf($grid_column) [void] $DataTable1.Columns.Add($grid_column.Name) # 初始化下拉列 $DataGridViewComboBoxColumnList[$colIndex] = New-Object System.Windows.Forms.DataGridViewComboBoxColumn $DataGridViewComboBoxColumnList[$colIndex].Name = $grid_column.Name $DataGridViewComboBoxColumnList[$colIndex].HeaderText = $grid_column.Name # 初始化下拉选项数据表 $ColumnDropdownDataTableList[$colIndex] = New-Object System.Data.DataTable [void] $ColumnDropdownDataTableList[$colIndex].Columns.Add($grid_column.Name) $DataSourceRows = ($ServiceList.$($grid_column.Name) | Sort-Object -Unique) ForEach ($DataSourceRow in $DataSourceRows) { [void] $ColumnDropdownDataTableList[$colIndex].Rows.Add($DataSourceRow) } $DataGridViewComboBoxColumnList[$colIndex].DataSource = $ColumnDropdownDataTableList[$colIndex] $DataGridViewComboBoxColumnList[$colIndex].ValueMember = $grid_column.Name $DataGridViewComboBoxColumnList[$colIndex].DisplayMember = $grid_column.Name # 核心修正:DataPropertyName只需填写绑定的列名,无需取属性值 $DataGridViewComboBoxColumnList[$colIndex].DataPropertyName = $grid_column.Name } # 按列顺序动态添加行,避免手动写属性顺序错位问题 $ServiceList | ForEach-Object { $rowValues = $grid_column_list | ForEach-Object { $_.GetValue($_) } [void] $DataTable1.Rows.Add($rowValues) } # 初始化窗体 $Form = New-Object System.Windows.Forms.Form $Form.Size = New-Object System.Drawing.Size(800,500) $Form.StartPosition = "CenterScreen" $Form.Add_Shown({ $Form.Activate() }) # 初始化DataGridView $DGV = New-Object System.Windows.Forms.DataGridView $DGV.Anchor = [System.Windows.Forms.AnchorStyles]::Right -bor [System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Left -bor [System.Windows.Forms.AnchorStyles]::Top $DGV.Location = New-Object System.Drawing.Point(0,0) $DGV.Size = New-Object System.Drawing.Size(780,400) $DGV.Font = New-Object System.Drawing.Font("Microsoft Sans Serif",10) $DGV.BackgroundColor = [System.Drawing.Color]::White $DGV.BorderStyle = "Fixed3D" $DGV.AlternatingRowsDefaultCellStyle.BackColor = [System.Drawing.Color]::FromArgb(230,230,230) $DGV.AutoSizeColumnsMode = [System.Windows.Forms.DataGridViewAutoSizeColumnsMode]::Fill $DGV.AutoSizeRowsMode = [System.Windows.Forms.DataGridViewAutoSizeRowsMode]::AllCells $DGV.SelectionMode = [System.Windows.Forms.DataGridViewSelectionMode]::FullRowSelect $DGV.ClipboardCopyMode = "EnableWithoutHeaderText" $DGV.AllowUserToOrderColumns = $True $DGV.AutoGenerateColumns = $False # 先加列再绑定数据源,保证绑定关系正常 $DGV.Columns.AddRange($DataGridViewComboBoxColumnList) $DGV.DataSource = $DataTable1 $Form.Controls.Add($DGV) # 导出按钮 $Button = New-Object System.Windows.Forms.Button $Button.Anchor = [System.Windows.Forms.AnchorStyles]::Left -bor [System.Windows.Forms.AnchorStyles]::Bottom $Button.Location = New-Object System.Drawing.Point(10,420) $Button.Size = New-Object System.Drawing.Size(100,30) $Button.Text = "导出" $Form.Controls.Add($Button) $Button.Add_Click({ $DataTable1 | Out-GridView }) [void] $Form.ShowDialog()
内容的提问来源于stack exchange,提问作者Darwin Ranzone
相关产品推荐
相关产品推荐

