You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过PowerShell、WPF和XAML删除DataGrid选中行?

PowerShell + WPF DataGrid 选中行删除无效排查方案

常见问题点及修复步骤

1. 选中行类型判断错误

绑定DataTable的DataGrid,选中项实际是DataRowView对象,不是直接的DataRow,直接删除会导致类型不匹配:

# 错误写法:直接操作SelectedItems
$DataGrid.SelectedItems | ForEach-Object { $DataTable.Rows.Remove($_) }

# 正确写法:提取Row对象
$selectedRows = $DataGrid.SelectedItems | ForEach-Object { $_.Row }

2. 未触发数据变更通知

修改DataTable后需要手动确认变更或刷新DataGrid视图,否则UI不会同步更新:

foreach ($row in $selectedRows) {
    $DataTable.Rows.Remove($row)
}
# 确认DataTable变更
$DataTable.AcceptChanges()
# 强制刷新DataGrid
$DataGrid.Items.Refresh()

3. 未在UI线程操作

WPF控件必须在UI线程修改,如果删除逻辑涉及后台线程调用,需要切换到UI线程执行:

$btnDelete.Add_Click({
    $null = $DataGrid.Dispatcher.Invoke([Action]{
        $selectedRows = $DataGrid.SelectedItems | ForEach-Object { $_.Row }
        foreach ($row in $selectedRows) {
            $DataTable.Rows.Remove($row)
        }
        $DataTable.AcceptChanges()
        $DataGrid.Items.Refresh()
    })
})

4. DataTable处于只读状态

检查DataTable的ReadOnly属性,若为True会阻止行删除:

if ($DataTable.ReadOnly) {
    $DataTable.ReadOnly = $false
}

完整可运行代码片段

# 假设XAML中DataGrid命名为dgSCCMData,删除按钮命名为btnDelete
$btnDelete.Add_Click({
    $selectedRows = @()
    # 遍历选中项提取有效DataRow
    foreach ($item in $dgSCCMData.SelectedItems) {
        if ($item -is [System.Data.DataRowView]) {
            $selectedRows += $item.Row
        }
    }

    if ($selectedRows.Count -gt 0) {
        # 临时解绑避免UI报错
        $dgSCCMData.ItemsSource = $null
        foreach ($row in $selectedRows) {
            $DataTable.Rows.Remove($row)
        }
        $DataTable.AcceptChanges()
        # 重新绑定数据
        $dgSCCMData.ItemsSource = $DataTable.DefaultView
    }
})

内容的提问来源于stack exchange,提问作者Ram Mansawala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 00:32:43