2

因此,我正在尝试创建一个自定义 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,依此类推。

到目前为止,我所做的只是为一列分配一个输入范围:进程名称。

请帮忙!

谢谢

4

5 回答 5

7

循环所有进程,并按照您定义列的顺序添加每个进程属性:

get-process | foreach{
    $dataGridView.Rows.Add($_.Name,$_.ID,$_.Description,$_.WorkingSet)
}

您还可以通过选择要显示的属性动态生成列,每个属性都成为列名,并使用网格的 DataSource 属性和数组列表将对象添加到网格:

$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()
于 2012-07-13T10:24:07.600 回答
2

但是为什么不Out-GridView拒绝 PoSH的用户呢?:

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

于 2012-07-13T10:25:28.013 回答
1

Akim - 脚本编写者尝试使用您可以看到但很少做的输出的单行代码,而程序员考虑用户界面并将输出控制权交到用户手中,因此 System.Windows.Forms.Form 是 powershell 程序员最好的朋友。

Shay - 我一直在做一些编程来使用 DataGridView,到目前为止我的经验告诉我,我必须控制定义 DataGridView 属性,而不是使用 .DataSource,如上面的一个示例所示。尽管它很方便,但是除了在表单上显示它之外,您不需要对 DataGridView 做太多事情。

我首先将 .ColCount 设置为我想要的列数。然后命名列。此后,我可以通过编号位置或名称调整每列的属性。我选择让用户对选定的列进行排序。截至 2013 年 3 月 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))}
于 2013-03-23T12:48:42.897 回答
0

我尝试了几种方法来摆弄单元格背景颜色,并且只在 Add_CellPainting 方面取得了成功。注意 MSDN 警告不要在特定位置设置单元格样式,除非您真的希望无论用户做什么都更改该位置。在下面的代码中,无论您如何对 datagridview 进行排序,第 2 行第 4 列都是红色的。那可能是一个 OOPS,或者你真的想要那个。嗯....按值设置会执行所有匹配的值,因此如果您有非唯一值,那么您可能需要额外的逻辑来仅更改您想要的值并在内容更改时重新绘制。

$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
于 2013-03-23T14:25:51.990 回答
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++ )
于 2013-09-08T03:18:09.833 回答