PowerShell:创建自定义DataGridView

3

我正在尝试创建一个自定义的Datagridview并将其放入我制作的GUI程序中,但是遇到了一些问题。

目前为止,我有以下内容:

$form = New-Object System.Windows.Forms.Form
$form.Size = New-Object System.Drawing.Size(900,600)
$dataGridView = New-Object System.Windows.Forms.DataGridView
$dataGridView.Size=New-Object System.Drawing.Size(800,400)

$form.Controls.Add($dataGridView)
$dataGridView.ColumnCount = 4
$dataGridView.ColumnHeadersVisible = $true
$dataGridView.Columns[0].Name = "Process"
$dataGridView.Columns[1].Name = "ID"
$dataGridView.Columns[2].Name = "Description"
$dataGridView.Columns[3].Name = "Memory"

$row1 = get-process -property name | select Name

$rows = @($row1)
foreach ($row in $rows)
{    
$dataGridView.Rows.Add($row.name)}
$form.ShowDialog()

我的问题是:

我该如何将不同的列分配给不同的属性,例如“进程”列用于进程名称,“ID”列用于进程ID等。

到目前为止,我只能将一个列分配给输入范围:进程名称。

请帮忙解决!

谢谢。

5个回答

9
循环所有进程,并按照您定义列的顺序添加每个进程属性:
get-process | foreach{
    $dataGridView.Rows.Add($_.Name,$_.ID,$_.Description,$_.WorkingSet)
}

您还可以通过选择要显示的属性动态生成列,每个属性都成为一个列名,并使用网格的DataSource属性和ArrayList将对象添加到网格中:
$form = New-Object System.Windows.Forms.Form
$form.Size = New-Object System.Drawing.Size(900,600)

$gps = get-process | select Name,ID,Description,@{n='Memory';e={$_.WorkingSet}}
$list = New-Object System.collections.ArrayList
$list.AddRange($gps)

$dataGridView = New-Object System.Windows.Forms.DataGridView -Property @{
    Size=New-Object System.Drawing.Size(800,400)
    ColumnHeadersVisible = $true
    DataSource = $list
}

$form.Controls.Add($dataGridView)
$form.ShowDialog()

谢谢Shay。我有一个快速问题,你如何设置列的大小(宽度)?$dataGridView.Columns[1].size = 430? - obious

2

但是为什么不用 PoSH 中的 Out-GridView 呢?:

get-process | select name, process, id, description, workingSet | Out-GridView


1
Akim - 脚本编写者尝试使用可见的一行代码,但对此做得很少,而程序员则考虑用户界面并将输出控制放在用户手中,因此System.Windows.Forms.Form是PowerShell程序员最好的朋友。
Shay - 我一直在编程以使用DataGridView,并且我的经验迄今为止表明,我必须控制定义DataGridView属性,而不使用如上例所示的.DataSource。方便虽然如此,但你对于你的DataGridView除了在表单上显示它之外并没有做太多事情。
我首先设置.ColCount为我想要的列数。然后命名列。此后,我可以通过编号位置或名称调整每个列的属性。我选择让用户在选定的列上进行排序。截至2013-03-23,我仍在努力解决如何设置我想要突出显示的单元格的背景颜色。应该很快就会有答案供那些想要做同样事情的人使用。我找到的一个例子使用单元格中的值,而不是位置。
$datagridview = New-Object System.Windows.Forms.DataGridView
$datagridview.ColumnCount = 8
$datagridview.Columns[0].Name = "#ID"
$datagridview.Columns[1].Name = "Name"
...[snip]...
$datagridview.Columns[7].Name = "Company"
$datagridview.Columns["Name"].SortMode = "Automatic"
$datagridview.Columns[8].SortMode = "Automatic"
$datagridview.Columns[0].Width = 50
$datagridview.Columns["Description"].Width = 350
...[snip]...
foreach ($_ in $arraylist){[void]$datagridview.Rows.Add($($_.ID), $($_.Name),$($_.Path), $($_.Description), $($_.VM), $($_.WS), $($_.CPU), $($_.Company))}

0

我已经找到了另一种方法来突出显示我选择的单元格:

$Script:PS_Log_Viewer_Form_row = $PS_Log_Viewer_Form_dataGridView1.Rows.Add("$($PS_Log_Viewer_total_records_ctr)", "$($PS_Log_Viewer_Form_line_date_time_sub)","$($PS_Log_Viewer_Form_line_acct)","$($PS_Log_Viewer_Form_line_msg)", "$($PS_Log_Viewer_Form_full_filename)-$($PS_Log_Viewer_file_records)")

$PS_Log_Viewer_Form_dataGridView1.Rows[$PS_Log_Viewer_Form_row].Cells[1].Style.BackColor = "BlanchedAlmond"

搜索所有行并设置(类似于查找全部):

for ($i = ($PS_Log_Viewer_Form_dataGridView1.FirstDisplayedScrollingRowIndex - 1) ; $i -gt 0 ; $i-- )
{
if ($PS_Log_Viewer_Form_dataGridView1.Rows[$i].Cells[3].Value.Contains("$($find_form_middle_flp_textbox_1.Text)") )
{
$PS_Log_Viewer_Form_dataGridView1.Rows[$i].Cells[3].Style.BackColor = $find_form_middle_flp_color_combobox_dropdownlist.SelectedItem
$PS_Log_Viewer_Form_dataGridView1.FirstDisplayedScrollingRowIndex = $i
$find_form_bottom_remarks = "Previous found at $($i)."
$i = 0
} # End of if ($PS_Log_Viewer_Form_dataGridView1.Rows[$i].Cells[3].Value.Contains("$($Script:PS_Log_Viewer_search_string)") )
} # End of for ($i = 0 ; $i -lt $PS_Log_Viewer_Form_dataGridView1.RowCount ; $i++ )

0

我尝试了几种方法来调整单元格背景颜色,只有使用Add_CellPainting才成功了。请注意MSDN的警告,除非您真正想要更改该位置,否则不要在特定位置设置单元格样式。在下面的代码中,第2行第4列无论如何排序DataGridView都是红色的。这可能是一个错误,或者您真的想要那样。嗯...按值设置会匹配所有匹配的值,因此如果您有非唯一的值,则可能需要其他逻辑来仅更改您想要的值并重新绘制,以防内容发生更改。

$datagridview.Add_CellPainting(
{
param($Null, $EventArgs)
if ($([String]$EventArgs.Value).ToLower().Contains("ms") -eq $True) { $EventArgs.CellStyle.BackColor = "Blue" ; $EventArgs.CellStyle.ForeColor = "White" }
if ($([String]$EventArgs.Value).ToLower().Contains("windows") -eq $True) { $EventArgs.CellStyle.BackColor = "Yellow" }
if ($([String]$EventArgs.Value).ToLower().Contains("windows powershell") -eq $True) { $EventArgs.CellStyle.BackColor = "Green" }
if (($EventArgs.RowIndex -eq 2) -and ($EventArgs.ColumnIndex -eq 4)) {$EventArgs.CellStyle.BackColor = "Red" }
}
) # End of Add_CellPainting

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接