2

そのため、作成した GUI プログラムに入れるカスタム Datagridview を作成しようとしていますが、問題が発生しています。

これまでのところ、私はこれを持っています:

$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などになります。

これまでのところ、1 つの列に入力範囲を割り当てるだけで済みました: Process Name.

助けてください!

ありがとう

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-GridViewPoSH からのユーザーになぜいいえ?:

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 プロパティの定義を制御し、上記の 1 つの例に示すように .DataSource を使用しない必要があることがわかりました。そのままで便利ですが、フォームに表示する以外に DataGridView を使用することはあまりありません。

.ColCount を必要な列数に設定することから始めました。次に、列に名前を付けます。その後、番号付きの場所または名前で各列のプロパティを微調整できます。ユーザーが選択した列で SORT できるようにすることにしました。2013-03-23 の時点で、強調表示したいセルの背景色を設定する方法にまだ取り組んでいます。同じことをしたい人のために、すぐにその答えが必要です。私が見つけた 1 つの例では、場所ではなく、セルの値を使用しています。

$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 に答える