Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Powershell:创建自定义DataGridView_Arrays_Powershell_Datagridview - Fatal编程技术网

Arrays Powershell:创建自定义DataGridView

Arrays Powershell:创建自定义DataGridView,arrays,powershell,datagridview,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 S

因此,我试图创建一个自定义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”列将代表process id等等

到目前为止,我所能做的就是为一列指定一个输入范围:进程名

请帮忙


感谢

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

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

但是为什么不允许用户
Out-GridView
from-PoSH?:


get process |选择名称、进程、id、描述、工作集| Out GridView

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))}

我尝试了几种方法来摆弄细胞背景颜色,但只在添加细胞绘画方面取得了成功。请注意MSDN警告,不要在特定位置设置cellstyle,除非您确实希望无论用户做什么都更改该位置。在下面的代码中,无论如何对datagridview排序,第2行第4列都是红色的。那可能是一个糟糕的结果,或者你真的想要那样。六羟甲基三聚氰胺六甲醚。。。。“按值设置”会处理所有匹配的值,因此如果您有非唯一的值,则可能需要额外的逻辑来仅更改所需的值,并在内容更改时重新绘制

$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

此后,我找到了另一种方式来突出我选择的单元格:

$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"
以及搜索所有行和设置(考虑全部查找):


谢谢谢伊。只是一个简单的问题,如何设置列的大小(宽度)$dataGridView.Columns[1]。大小=430?
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++ )