string.contains函数异常:无附件旅行请求被误标记为有附件
问题原因及解决办法
看起来你遇到的问题主要来自两个方面:匹配逻辑的不精确,以及复选框状态没有正确初始化。咱们一步步拆解:
核心问题分析
1. Contains()方法导致的潜在误匹配
你现在用doc.Contains(TravelID)来判断文档是否属于当前旅行请求,但这个方法是检查子字符串是否存在,而非精确匹配。比如如果两个TravelID共享前缀(像你测试案例里的RONNIEP20180124),哪怕完整ID不一样,Contains()也可能误判——虽然你给出的具体对比里这个情况没触发,但这是个必须修正的潜在坑。
2. 复选框状态未正确重置
你的代码只在找到匹配文档时把复选框设为True,但如果没有找到匹配的文档,完全没处理它的状态。如果复选框默认是True,或者之前操作不小心把它设成了True,那即使没有附件,它也会保持勾选状态——这应该就是你测试时第二行误勾选的直接原因。
修正后的代码方案
我调整了你的代码,解决了这两个问题,同时优化了循环逻辑:
Imports System.IO ' 记得引入IO命名空间,否则Path类无法使用 ' 获取所有文档路径 Dim docPaths As String() = Directory.GetFiles("E:\DomainWebs\Intranet\fileups\TravelDocs\") ' 遍历表格每一行 For Each row As GridRecord In TravelWebDataGrid.Rows ' 先把当前行的复选框重置为False,确保初始状态正确 row.Items(11).Value = False ' 获取当前行的TravelID并去除首尾空格 Dim currentTravelID As String = row.Items(10).Value.ToString().Trim() ' 遍历所有文档,查找匹配项 For Each docPath As String In docPaths ' 提取文件名(不带路径和后缀) Dim fileNameWithoutExt As String = Path.GetFileNameWithoutExtension(docPath) ' 按分隔符"-"拆分文件名,取第一部分作为文档对应的TravelID ' 这里假设你的文档命名规则是「TravelID-自定义名称.docx」 Dim docTravelID As String = fileNameWithoutExt.Split("-"c)(0).Trim() ' 精确匹配TravelID,忽略大小写(不需要的话可以去掉第二个参数) If docTravelID.Equals(currentTravelID, StringComparison.OrdinalIgnoreCase) Then row.Items(11).Value = True Exit For ' 找到匹配后直接退出内层循环,提升效率 End If Next Next
关键改进点说明
- 精确匹配:不再用
Contains(),而是直接提取文档文件名中的TravelID部分,和当前行的TravelID做精确对比,从根源避免部分匹配的误判。 - 状态重置:每处理一行前先把复选框设为
False,确保没有匹配附件时显示正确的未勾选状态。 - 循环优化:直接用
row对象操作,不再依赖i索引,避免索引错位的潜在问题。 - 效率提升:找到匹配文档后立即退出内层循环,不用遍历剩余文档。
如果你的文档命名规则不是「TravelID-自定义名称」,可以告诉我具体格式,我再调整匹配逻辑~
内容的提问来源于stack exchange,提问作者kodym
相关产品推荐
相关产品推荐

