为委托传递的字符串新增字符后无法写入DataGridView问题求助
问题根因分析
- InvokeRequired分支差异是错觉
InvokeRequired属性的返回值只和当前执行gridError方法的线程是否为窗体UI线程有关,和传入的字符串内容完全无关。你在BackgroundWorker的后台线程中调用gridError时,永远会先进入Me.InvokeRequired = True的分支,通过Invoke封送到UI线程后第二次执行gridError才会进入else分支,你感知到的差异本质是else分支中没有执行添加行的逻辑,误以为没有进入else分支。 - 新增分号后无数据的核心原因
你拆分字符串后仅判断了数组长度为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
相关产品推荐
相关产品推荐

