2017-05-05 79 views
0

我想设置DataGridViewComboBoxColumn的默认值是一个变量,但我找不到要设置的属性。PowerShell DataGridView ComboBoxColumn默认值

$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 
[email protected](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

+0

这里的[MSDN页](https://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewcomboboxcolumn(V = vs.110)的.aspx),选择那些类 – BenH

+0

我认为这是价值观,但我没有得到它的背景。 – Nate

回答

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

$ DropDownArray似乎没有一个名为.columns的函数,每行都会出现以下错误:'您无法在空值表达式上调用方法。 + [void] $ DropDownArray.Columns.Add(“RGB”)'。 – Nate

+0

确保它是一个DataTable对象,而不是数组,因为它在您的文章中。 – atownson

+0

您可以测试您的答案或将其替换为适合我的用途的答案吗?我无法让你的工作(上面列出的错误),我正在努力解决这个问题。 – Nate