Powershell - DataViewGrid - 列自动调整大小

问题描述 投票:0回答:4

对于 .NET 和 powershell,我完全是个新手,想知道你们是否可以提供帮助。我正在从表单上的 .CSV 生成数据网格,并希望网格相应地自动调整列大小。另外,如果我可以锁定用户调整的列/行,那就太棒了。

Clear-Host
Function Populate-CycleCountDataGrid {
  $InventoryListArray = New-Object System.Collections.ArrayList
  $Script:InventoryList = @(Import-CSV C:\File.csv | Write-Output)
  $InventoryListArray.AddRange($Script:InventoryList)
  $CycleCountDataGrid.DataSource = $InventoryListArray
}

Function GenerateForm {
  $objForm = New-Object System.Windows.Forms.Form
  $InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState

  $RefreshButton_Click = {
    Populate-CycleCountDataGrid
  }

    # Form Setup
    #*******************************************************************************************\
    $OnLoadForm_StateCorrection= { $objForm.WindowState = $InitialFormWindowState }

    $objForm.Text = "CycleCount"
    $objForm.Name = "CycleCount"
    $objForm.Size = New-Object System.Drawing.Size(600,480)
    $objForm.StartPosition = 0
    $objForm.AutoSize = $False
    $objForm.MinimizeBox = $False
    $objForm.MaximizeBox = $False
    $objForm.WindowState = "Normal"

    # DataGrid
    #*******************************************************************************************\
    $CycleCountDataGrid = New-Object System.Windows.Forms.DataGrid
    $CycleCountDataGrid.Location = New-Object System.Drawing.Size(0,0)
    $CycleCountDataGrid.Size = New-Object System.Drawing.Size(592,400)
    $CycleCountDataGrid.AutoSize = $False
    $CycleCountDataGrid.AllowSorting = $False
    $CycleCountDataGrid.ReadOnly = $True
    $CycleCountDataGrid.CaptionText = "Inventory List"
    $CycleCountDataGrid.HeaderFont = New-Object System.Drawing.Font("Verdana",8.25,1,3,0)
    $CycleCountDataGrid.HeaderForeColor = [System.Drawing.Color]::FromArgb(255,0,0,0)
    $CycleCountDataGrid.Font = New-Object System.Drawing.Font("Verdana",8.25,[System.Drawing.FontStyle]::Bold)
    $CycleCountDataGrid.BackColor = [System.Drawing.Color]::FromArgb(255,0,160,250)
    $CycleCountDataGrid.AlternatingBackColor = [System.Drawing.Color]::FromArgb(255,133,194,255)
    $CycleCountDataGrid.Name = "CycleCountDataGrid"
    $CycleCountDataGrid.DataBindings.DefaultDataSourceUpdateMode = 0
    $objForm.Controls.Add($CycleCountDataGrid)
    #*******************************************************************************************/

    # Refresh Button
    #*******************************************************************************************\
    $RefreshButton = New-Object System.Windows.Forms.Button
    $RefreshButton.Location = New-Object System.Drawing.Size(0,400)
    $RefreshButton.Size = New-Object System.Drawing.Size(590,45)
    $RefreshButton.Name = "RefreshButton"
    $RefreshButton.Text = "Refresh"
    $RefreshButton.UseVisualStyleBackColor = $True
    $RefreshButton.add_Click($RefreshButton_Click)
    $RefreshButton.DataBindings.DefaultDataSourceUpdateMode = 0
    $objForm.Controls.Add($RefreshButton)
    #*******************************************************************************************/

    $objForm.Topmost = $True
    $objForm.Add_Shown({$objForm.Activate()})
    $objForm.FormBorderStyle = 'Fixed3D'
    $objForm.MaximizeBox = $False
    $objForm.Add_FormClosing([System.Windows.Forms.FormClosingEventHandler]{
        if ($objForm.DialogResult -eq "Cancel") {}
    })

    $InitialFormWindowState = $objForm.WindowState
    $objForm.add_Load($OnLoadForm_StateCorrection)
    $objForm.ShowDialog()
    #*******************************************************************************************/
}
GenerateForm
powershell datagrid autosize
4个回答
2
投票

添加以下代码:

$CycleCountDataGrid.Columns | Foreach-Object{
    $_.AutoSizeMode = [System.Windows.Forms.DataGridViewAutoSizeColumnMode]::AllCells
}

0
投票

将控件更改为 system.windows.forms.datagridview 而不仅仅是数据网格。 然后您就可以访问

$CycleCountDataGrid.columns

每列都有一个宽度属性。 上面的答案将尝试自动调整每一列的大小,但如果您愿意,您可以指定每一列。

$CycleCountDatarid.columns[0].width = 200

默认为100


0
投票

自动调整 Windows.Forms.Datagrid 大小的秘密在于它有一个私有方法“ColAutoResize”,您可以使用反射调用:

Function AutoResizeColumns([System.Windows.Forms.DataGrid] $dg1){ 
    [System.Reflection.BindingFlags] $F = 'static','nonpublic','instance' 
    $ColAutoResizeMethod = $dg1.GetType().GetMethod('ColAutoResize', $F) 
    If($ColAutoResizeMethod) { 
        For ([int]$i = $dg1.FirstVisibleColumn; $i -lt $dg1.VisibleColumnCount; $i++){
            $ColAutoResizeMethod.Invoke($dg1, $i) | Out-Null 
        }
    }
}

一旦拥有该函数,您可以将其添加到 DataGrid 的 VisibleChanged 和 DataSourceChanged 事件中,以便绘制和刷新 DataGrid 将调用 AutoResizeColumns:

$objForm.Controls["CycleCountDataGrid"].add_DatasourceChanged({ AutoResizeColumns $objForm.Controls["CycleCountDataGrid"] } )
$objForm.Controls["CycleCountDataGrid"].add_VisibleChanged({ AutoResizeColumns $objForm.Controls["CycleCountDataGrid"] } )
$objForm.ShowDialog() | Out-Null

可能有一种更干净的方法可以做到这一点,但它对我有用。


0
投票

这对我有用。 请注意,在我的例子中,它是一个 DataGridView。但如果您知道在 AutoSizeColumnsMode 中填写什么值,它应该工作相同:

$dataGridView=New-Object System.Windows.Forms.DataGridView
$dataGridView.AutoSizeColumnsMode='AllCells'

在 powershell ISE 上,如果我输入任何错误值,我会收到此错误,该错误可能有用:定义“AutoSizecolumnsMode”时出现异常:[...] 可能的枚举值为“None;ColumnHeader;AllCellsExceptHeader;AllCells;DisplayedCellsExceptHeader;DisplayedCells” ;填充”。

© www.soinside.com 2019 - 2024. All rights reserved.