Powershell:创建自定义DataGridView

时间:2012-07-13 10:10:50

标签: arrays powershell datagridview

所以我正在尝试创建一个自定义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()

我的问题是:

如何将不同的列分配给不同的属性,因此列'process'将用于procress名称,列'id'将用于进程ID等等。

到目前为止,我所要做的就是为一个列分配一个输入范围:Process Name。

请帮忙!

谢谢

5 个答案:

答案 0 :(得分:3)

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

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

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

$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()

答案 1 :(得分:2)

但是为什么没有来自PoSH的用户Out-GridView?:

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

答案 2 :(得分:1)

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

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

我首先将.ColCount设置为我想要的列数。然后命名列。此后,我可以通过编号的位置或名称调整每列的属性。我选择让用户SORT选择列。截至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))}

答案 3 :(得分:0)

我尝试了几种方法来处理单元格背景颜色,并且只在Add_CellPainting中取得了成功。注意MSDN警告不要将cellstyle设置在特定位置,除非你真的希望无论用户做什么都改变了位置。在下面的代码中,无论您如何对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

答案 4 :(得分: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++ )