1

目標: CSV データを入力した GUI フォームを作成し、ユーザーがデータを編集できるようにしてから、さらに操作できるようにデータを配列に保存します。

注: PowerShell Studio を使用して、CSV からのデータを含むフォームを生成します

現在のコード: - 呼び出しコード ($path は呼び出しフォームから渡されます):

$rows = Import-Csv -Path $path
$table = ConvertTo-DataTable -InputObject $rows
Load-DataGridView -DataGridView $datagridviewResults -Item $table
  • ConvertTo-DataTable 関数:
function ConvertTo-DataTable {
    
    [OutputType([System.Data.DataTable])]
    param(
        [ValidateNotNull()]
        $InputObject, 
        [ValidateNotNull()]
        [System.Data.DataTable]$Table,
        [switch]$RetainColumns,
        [switch]$FilterWMIProperties
    )

    if($Table -eq $null) {
        $Table = New-Object System.Data.DataTable
    }

    if($InputObject-is [System.Data.DataTable]) {
        $Table = $InputObject
    } else {
        if(-not $RetainColumns -or $Table.Columns.Count -eq 0) {
            #Clear out the Table Contents
            $Table.Clear()

            if($InputObject -eq $null){ return } #Empty Data

            $object = $null
            #find the first non null value
            foreach($item in $InputObject) {
                if($item -ne $null) {
                    $object = $item
                    break   
                }
            }

            if($object -eq $null) { return } #All null then empty

            #Get all the properties in order to create the columns
            foreach ($prop in $object.PSObject.Get_Properties()) {
                if(-not $FilterWMIProperties -or -not $prop.Name.StartsWith('__')) { #filter out WMI properties
                    #Get the type from the Definition string
                    $type = $null

                    if($prop.Value -ne $null) {
                        try{ $type = $prop.Value.GetType() } catch {}
                    }

                    if($type -ne $null) { # -and [System.Type]::GetTypeCode($type) -ne 'Object')
                        [void]$table.Columns.Add($prop.Name, $type) 
                    } else { #Type info not found
                        [void]$table.Columns.Add($prop.Name)    
                    }
                }
            }

            if($object -is [System.Data.DataRow]) {
                foreach($item in $InputObject) {    
                    $Table.Rows.Add($item)
                }
                return  @(,$Table)
            }
        } else {
            $Table.Rows.Clear() 
        }

        foreach($item in $InputObject) {        
            $row = $table.NewRow()

            if($item) {
                foreach ($prop in $item.PSObject.Get_Properties()) {
                    if($table.Columns.Contains($prop.Name)) {
                        $row.Item($prop.Name) = $prop.Value
                    }
                }
            }
            [void]$table.Rows.Add($row)
        }
    }

    return @(,$Table)   
}
  • Load-DataGridView 関数:
function Load-DataGridView {
    
    Param (
        [ValidateNotNull()]
        [Parameter(Mandatory=$true)]
        [System.Windows.Forms.DataGridView]$DataGridView,
        [ValidateNotNull()]
        [Parameter(Mandatory=$true)]
        $Item,
        [Parameter(Mandatory=$false)]
        [string]$DataMember
    )
    $DataGridView.SuspendLayout()
    $DataGridView.DataMember = $DataMember
    $DataGridView.EditMode = 'EditOnEnter'

    if ($Item -is [System.ComponentModel.IListSource]`
    -or $Item -is [System.ComponentModel.IBindingList]`
    -or $Item -is [System.ComponentModel.IBindingListView]) {
        $DataGridView.DataSource = $Item
    } else {
        $array = New-Object System.Collections.ArrayList

        if ($Item -is [System.Collections.IList]) {
            $array.AddRange($Item)
        } else {    
            $array.Add($Item)   
        }
        $DataGridView.DataSource = $array
    }

    $DataGridView.ResumeLayout()
}

追加情報: コードは、グリッド ビューを生成し、CSV データを入力するという点で機能しています。ただし、編集することはできず、編集後に変更をキャプチャする機能をコーディングする助けが必要です。

前もって感謝します。

12/5 EDIT : 上記「Load-DataGridView」関数に「$DataGridView.EditMode = 'EditOnEnter'」を追加。何も変わっていません。新しい RowCellClick イベントで「BeginEdit」イベントを呼び出そうとしましたが、それも機能しませんでした。まだこれに苦労しています。

4

1 に答える 1