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

为委托传递的字符串新增字符后无法写入DataGridView问题求助

问题根因分析

  1. InvokeRequired分支差异是错觉
    InvokeRequired属性的返回值只和当前执行gridError方法的线程是否为窗体UI线程有关,和传入的字符串内容完全无关。你在BackgroundWorker的后台线程中调用gridError时,永远会先进入Me.InvokeRequired = True的分支,通过Invoke封送到UI线程后第二次执行gridError才会进入else分支,你感知到的差异本质是else分支中没有执行添加行的逻辑,误以为没有进入else分支。
  2. 新增分号后无数据的核心原因
    你拆分字符串后仅判断了数组长度为2或3的场景,新增分号后,字符串按分号拆分得到的数组长度会变成4,没有匹配的分支处理,因此不会执行Rows.Add逻辑,自然看不到数据写入网格。

修复方案

1. 调整字符串拆分后的处理逻辑

修改gridError方法中数组判断的代码,兼容多段内容的场景,避免新增分号后无匹配分支:

Public Sub gridError(argumentos As String)
    If Me.InvokeRequired() Then
        Me.Invoke(New Action(Of String)(AddressOf gridError), argumentos)
    Else
        vector = argumentos.Split(delimitadores, StringSplitOptions.None)
        If vector.Length >= 3 Then
            ' 长度大于等于3时,将第三段及之后的内容用分号拼接作为第三列值
            DataErrores.Rows.Add(vector(0), vector(1), String.Join(";", vector.Skip(2)))
        ElseIf vector.Length = 2 Then
            DataErrores.Rows.Add(vector(0), " ", vector(1))
        Else
            ' 可选:添加异常日志,方便后续排查非法格式的入参
            Debug.WriteLine($"入参格式异常:{argumentos}")
        End If
    End If
End Sub

2. 可选优化(老项目可忽略)

如果是新项目开发,推荐使用Async/Await替代BackgroundWorker处理后台任务,无需手动处理线程封送逻辑,代码可维护性更高。

内容的提问来源于stack exchange,提问作者Mario Braham

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:54:00