如何解决以 DataTable 作为源和 SuggestAppend 组合框列和动态单元格分配的 DataGridView 测试代码:示例代码中包含哪些内容?示例截图代码片段
我一直在做一些研究,但找不到答案,可能我没有问正确的问题,或者我正在尝试的东西可能是不可能的。
那么,假设我有一个 DataTable
绑定到一个 DataGridView
,是否可以在某些数据源列中使用 SuggestAppend
?
作为示例(下面的代码),我有一个 DataGridView
,其中包含 Employee 和 Status 列。 Status 列是一个 DataGridViewComboBoxColumn
,包含 Active 和 Withdraw 项。网格有一个 DataTable
作为源,它具有相同的列(Employee & Status),我使用它是因为一旦修改后导出数据更容易,但可能有更好的方法.
那么,是否可以让我的 DataTable
使用我为 DataGridView
创建的列?
测试代码:
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName PresentationFramework
$mainForm=New-Object System.Windows.Forms.Form
$mainForm.StartPosition='CenterScreen'
$mainForm.FormBorderStyle='Fixed3D'
$mainForm.Text='Test'
$mainForm.WindowState='Maximized'
$bounds=($mainForm.CreateGraphics()).VisibleClipBounds.Size
$dataGrid=New-Object System.Windows.Forms.DataGridView
$dataGrid.Size=New-Object System.Drawing.Size(($bounds.Width-20),$($bounds.Height-140))
$dataGrid.Location=New-Object System.Drawing.Size(10,60)
$dataGrid.AllowUserToAddRows=$true
$dataGrid.SelectionMode=0
$dataGrid.MultiSelect=$True
$dataGrid.ReadOnly=$false
$dataGrid.RowHeadersVisible=$false
$dataGrid.ColumnHeadersBorderStyle=2
$dataGrid.EnableHeadersVisualStyles=$True
$col1=New-Object System.Windows.Forms.DataGridViewComboBoxColumn
$col1.Name = 'Status'
$col1.HeaderText = 'Status'
$col1.Items.AddRange('Active','Withdraw')
$dataGrid.Columns.Add([System.Windows.Forms.DataGridViewColumn],'Employee')
$dataGrid.Columns.Add($col1)
$dataGrid.Add_EditingControlShowing({
$Box=$_.Control -as [System.Windows.Forms.ComboBox]
if($Box)
{
$dataGrid.EditingControl.DropDownStyle = [System.Windows.Forms.ComboBoxStyle]::DropDown
$dataGrid.EditingControl.AutoCompleteMode = [System.Windows.Forms.AutoCompleteMode]::SuggestAppend
}
})
$dataGrid.AutoSizeColumnsMode=[System.Windows.Forms.DataGridViewAutoSizeColumnMode]::Fill
#$dataGrid.Columns[-1].AutoSizeMode=[System.Windows.Forms.DataGridViewAutoSizeColumnMode]::Fill
$mainForm.Controls.Add($dataGrid)
#### Begin of DataTable as Source here
$source=@'
Employee,Status
user.example1,Active
user.example2,Withdraw
user.example3,Withdraw
user.example4,Active
'@|ConvertFrom-Csv
$columns=$source[0].PSobject.Properties.Name
$table = New-Object system.Data.DataTable
foreach($column in $columns)
{
$i = New-Object System.Data.DataColumn
$i.DataType = [string]
$i.ColumnName = $column
$table.Columns.Add($i)
}
foreach($line in $source)
{
$row = $table.NewRow()
foreach($column in $columns)
{
$row.$column = $line.$column
}
$table.Rows.Add($row)
}
$dataGrid.DataSource=$table
$mainForm.Add_Shown({$mainForm.Activate()})
$mainForm.ShowDialog()
解决方法
多亏了 @JohnG's 的指导,我才能完成这项工作,如果这对您有用,请感谢他而不是我。
示例代码中包含哪些内容?
-
DataTable
有界于DataGridView
-
DataGrid Columns
与DataTable
列配对 -
DataGridViewComboBoxColumn
与DropDown
和SuggestAppend
- 动态单元格分配,理论上可以使用
DataColumn's
表达式完成,但我无法在 PowerShell 上获得IIF
条件,因此我使用.Add_CellEndEdit
事件来更新 {{ 1}} 项。即:DataBound
示例截图
代码片段
$this.CurrentRow.DataBoundItem['Code'] = '1'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。