PowerShell DataGridView ComboBoxColumn默认值

时间:2017-05-05 23:48:25

标签: winforms powershell datagridview

我正在尝试将DataGridViewComboBoxColumn的默认值设置为变量,但我找不到要设置的属性。

$Column2 = New-Object System.Windows.Forms.DataGridViewComboBoxColumn
$Column2.width = 60
$Column2.name = "Status"
$Column2.DataSource = $DropDownArray
$DataGrid.Columns.Add($Column2)

我试过了:

$Column2.Value = "C"
$Column2.ValueMember = $DDI
$Column2.DataPropertyName = $DDI
$Column2.DisplayMember = $DDI
$Column2.Text = $DropDown.SelectedItem
If($Column2.Index -ge "0"){$Column2.ValueMember = "C"}

$DDI回调数组项。 感谢您的帮助。

修改

我认为我的沟通不够好。这是我到目前为止所做的事情(当然,忽略所有注释掉的东西):

$null=[reflection.assembly]::LoadWithPartialName("System.Windows.Forms")
$null=[reflection.assembly]::LoadWithPartialName("System.Drawing")

#Initialize DataGrid stuff
$form = new-object System.Windows.Forms.Form
$form.Size = new-object System.Drawing.Size 800,400
$DataGrid = new-object System.Windows.Forms.DataGridView
#$DataGrid = new-object System.windows.forms.DataGrid
$DataGrid.AutoSize = $True
$DataGrid.EditMode = 'EditOnEnter'
#$DataGrid.BeginEdit()
[array]$DropDownArray = "FVR","C","O","P"
#$DropDownArray = @(Import-Csv "$BkpLoc\array.csv")

#This creates the Ok button and sets the event
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(750,375)
$OKButton.Size = New-Object System.Drawing.Size(150,125)
$OKButton.Text = "OK"
$OKButton.Add_Click({$form.Close()})
$OKButton.TabIndex = 9


$array= new-object System.Collections.ArrayList
$data=@(Import-CSV $SAMTemp2)
$array.AddRange($data)
$DataGrid.DataSource = $array

#$DataGrid.Columns.Remove($array.Status)
#Figure out how to set the array to read-only
#$array.IsReadOnly

    $Column1 = New-Object System.Windows.Forms.DataGridViewCheckBoxColumn
    $Column1.width = 60
    $Column1.name = "Planned"
    $DataGrid.Columns.Add($Column1) 

    $Column2 = New-Object System.Windows.Forms.DataGridViewComboBoxColumn
    $Column2.width = 60
    $Column2.name = "Status"
    $Column2.DataSource = $DropDownArray
    $DataGrid.Columns.Add($Column2)

    #$Column2.Selected = $DropDownArray[1]
    #$Column2.DisplayMember = "Status"
    #$Column2.DataPropertyName = $DropDownArray[1]
    #$Column2.ValueMember = $DropDownArray.Item(1)

    $array = New-Object System.Collections.ArrayList
    $form.refresh()

#finally show display the Grid
$DataGrid.Dock = [System.Windows.Forms.DockStyle]::Fill
$form.Controls.Add($DataGrid)

$form.controls.add($OKButton)
$form.topmost = $true
$null = $form.showdialog()

我的目标是$Column1可以检查当天是否计划任务(由用户决定),$Column2默认为导出状态(FVR,C,O)或P),如果数据不正确,允许用户将其更改为另一个选项。所以我最终希望根据如下语句设置默认值:

If($_.Status -eq "Open"){$Column2.ValueMember = <WHATEVER IT TAKES TO GET THE CURRENT VALUE TO "O">
$Column2.DataPropertyName = <WHATEVER IT TAKES TO GET THE CURRENT VALUE TO "O">
$Column2.DisplayMember = <WHATEVER IT TAKES TO GET THE CURRENT VALUE TO "O">

每个值都一样。 ($ _。状态是导入的CSV中的一列。)现在我无法正确使用它。我的数组应该多于4个值吗?我现在为ValueMember尝试的所有内容都会回来说Field called -WHATEVER- does not exist

1 个答案:

答案 0 :(得分:2)

当您向DataGridView添加行或数据绑定时,您将指定该列的默认值或选定值,然后它将被转换为您的组合框。 ValueMember是您正在寻找的,因为它与数据的实际值相关联,而不是组合框(DisplayMember)中显示的值。 ValueMember和DisplayMember可以相同,但不一定是。

见下面的例子。这将创建颜色名称和RGB值的数据源。

# Datatable for your CSV content
$DataTable1 = New-Object System.Data.DataTable
[void] $DataTable1.Columns.Add("Fruit")
[void] $DataTable1.Columns.Add("RGB")

# Your CSV content
@"
Fruit,RGB
apple,ff0000
apple,00ff00
kiwi,00ff00
"@ | ConvertFrom-Csv | ForEach-Object {
    [void] $DataTable1.Rows.Add($_.Fruit, $_.RGB)
    }

# Acceptable color values datatable - for your combobox
$DataTable2 = New-Object System.Data.DataTable
[void] $DataTable2.Columns.Add("RGB")
[void] $DataTable2.Columns.Add("Color")
# Manually add rows. You can programmatically add the rows as well 
[void] $DataTable2.Rows.Add("ff0000", "red")
[void] $DataTable2.Rows.Add("00ff00", "green")
[void] $DataTable2.Rows.Add("0000ff", "blue")

# Form
$Form = New-Object System.Windows.Forms.Form
$Form.Size = New-Object System.Drawing.Size(500,500)
$Form.StartPosition = "CenterScreen"

# Form event handlers
$Form.Add_Shown({
    $Form.Activate()
    })

# Datagridview
$DGV = New-Object System.Windows.Forms.DataGridView
$DGV.Anchor = [System.Windows.Forms.AnchorStyles]::Right -bor [System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Left -bor [System.Windows.Forms.AnchorStyles]::Top
$DGV.Location = New-Object System.Drawing.Size(0,0) 
$DGV.Size = New-Object System.Drawing.Size(480,400)
$DGV.Font = New-Object System.Drawing.Font("Microsoft Sans Serif",10,0,3,1)
$DGV.BackgroundColor = "#ffffffff"
$DGV.BorderStyle = "Fixed3D"
$DGV.AlternatingRowsDefaultCellStyle.BackColor = "#ffe6e6e6"
$DGV.AutoSizeColumnsMode = [System.Windows.Forms.DataGridViewAutoSizeColumnsMode]::Fill
$DGV.AutoSizeRowsMode = [System.Windows.Forms.DataGridViewAutoSizeRowsMode]::AllCells
$DGV.SelectionMode = [System.Windows.Forms.DataGridViewSelectionMode]::FullRowSelect
$DGV.ClipboardCopyMode = "EnableWithoutHeaderText"
$DGV.AllowUserToOrderColumns = $True
$DGV.DataSource = $DataTable1
$DGV.AutoGenerateColumns = $False
$Form.Controls.Add($DGV)

# Datagridview columns
$Column1 = New-Object System.Windows.Forms.DataGridViewTextBoxColumn
$Column1.Name = "Fruit"
$Column1.HeaderText = "Fruit"
$Column1.DataPropertyName = "Fruit"
$Column1.AutoSizeMode = "Fill"

$Column2 = New-Object System.Windows.Forms.DataGridViewComboBoxColumn
$Column2.Name = "Color"
$Column2.HeaderText = "Color"
$Column2.DataSource = $DataTable2
$Column2.ValueMember = "RGB"
$Column2.DisplayMember = "Color"
$Column2.DataPropertyName = "RGB"

$DGV.Columns.AddRange($Column1, $Column2)

# Button to export data
$Button = New-Object System.Windows.Forms.Button
$Button.Anchor = [System.Windows.Forms.AnchorStyles]::Left -bor [System.Windows.Forms.AnchorStyles]::Bottom
$Button.Location = New-Object System.Drawing.Size(10,420) 
$Button.Text = "Export"
$Form.Controls.Add($Button)

# Button event handlers
$Button.Add_Click({
    $DataTable1 | Out-GridView # do what you want
    })

# Show form
[void] $Form.ShowDialog()