微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

以 DataTable 作为源和 SuggestAppend 组合框列和动态单元格分配的 DataGridView 测试代码:示例代码中包含哪些内容?示例截图代码片段

如何解决以 DataTable 作为源和 SuggestAppend 组合框列和动态单元格分配的 DataGridView 测试代码:示例代码中包含哪些内容?示例截图代码片段

我一直在做一些研究,但找不到答案,可能我没有问正确的问题,或者我正在尝试的东西可能是不可能的。

那么,假设我有一个 DataTable 绑定到一个 DataGridView,是否可以在某些数据源列中使用 SuggestAppend

作为示例(下面的代码),我有一个 DataGridView,其中包含 EmployeeStatus 列。 Status 列是一个 DataGridViewComboBoxColumn,包含 ActiveWithdraw 项。网格有一个 DataTable 作为源,它具有相同的列(Employee & Status),我使用它是因为一旦修改后导出数据更容易,但可能有更好的方法.

那么,是否可以让我的 DataTable 使用我为 DataGridView 创建的列?

enter image description here

测试代码

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 ColumnsDataTable 列配对
  • DataGridViewComboBoxColumnDropDownSuggestAppend
  • 动态单元格分配,理论上可以使用 DataColumn's 表达式完成,但我无法在 PowerShell 上获得 IIF 条件,因此我使用 .Add_CellEndEdit 事件来更新 {{ 1}} 项。即:DataBound

示例截图

DGV Example

DataTable Example

代码片段

$this.CurrentRow.DataBoundItem['Code'] = '1'

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。