2013-08-31 3 views
0

Я полный новичок, когда дело доходит до .NET и powershell, и задавался вопросом, могли бы вы, ребята, помочь. Я генерирую Data Grid из .CSV в форме и хотел бы, чтобы сетка автоматически соответствовала столбцам размера. Также, если бы я мог блокировать столбцы/строки от пользовательской настройки, что было бы удивительно.Powershell - DataViewGrid - Column Autosize

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 
+0

Hey Mitul, Я действительно не понимаю, есть ли способ предоставить пример с помощью сценария выше? –

+0

http://odetocode.com/articles/59.aspx – Mitul

ответ

0

Добавьте следующий код:

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

Изменить свой контроль на system.windows.forms.datagridview, а не просто DataGrid. Тогда у вас есть доступ к $CycleCountDataGrid.columns

Каждый столбец имеет свойство ширины. В приведенном выше ответе будет предпринята попытка автосохранения каждого столбца, но вы можете указать каждый из них, если хотите.

$CycleCountDatarid.columns[0].width = 200 

100 является значением по умолчанию

0

Секрет Autosizing в 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 
     } 
    } 
} 

После того как вы есть эта функция, вы можете добавить ее к событиям VisibleChanged и DataSourceChanged в DataGrid, поэтому рисование и обновление DataGrid вызовет AutoResizeColumns:

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

Возможно, это более чистый способ сделать это, но он работает для меня.