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

WinForms C#中TextBox错误行高亮功能失效问题求助

问题:JSON解析错误时无法高亮TextBox对应行

我在解析一段JSON内容时,想在出错时自动高亮TextBox里错误所在的行,但试了一段代码却没效果。

待解析的JSON:

{ "datalist": { "name":"abc", "collegename":"xyz", "degree":"123" } }

我写的代码:

txtBox1.SelectionStart = txtBox1.GetFirstCharIndexFromLine(exceptionObject.Lineposition);
txtBox1.SelectionLength = 10;
txtBox1.setFocus();

咱们来一步步排查问题,大概率是这几个细节没处理到位:

  1. 行号索引不匹配
    TextBox的GetFirstCharIndexFromLine是从0开始计数的,但多数JSON解析库返回的错误行号是从1开始的(比如Newtonsoft.Json的JsonReaderException.LineNumber)。如果你的exceptionObject.Lineposition是从1起始的,直接传值就会定位到错误的行,自然看不到高亮效果。

  2. 固定选中长度不合理
    你设置了SelectionLength = 10,但错误行的实际长度可能远大于或小于10,要么没覆盖整行,要么选中了无关内容。应该获取对应行的真实长度来实现整行高亮。

  3. HideSelection属性的默认坑
    TextBox的HideSelection属性默认是true,意思是控件失焦时选中内容会隐藏。哪怕调用了Focus(),有时候也会因为UI线程延迟导致高亮不显示,所以得把这个属性设为false。

  4. 异常属性名可能搞错
    不同JSON解析库的错误对象,行号属性名可能不同。比如用Newtonsoft.Json的话,行号属性是LineNumber,不是Lineposition,得确认你用的库对应的属性名是否正确。


给你修正后的代码,把这些问题都处理了:

// 先处理行号索引,假设异常返回的行号从1开始
int targetLine = exceptionObject.Lineposition - 1;

// 确保目标行在TextBox的行范围内,避免数组越界报错
if (targetLine >= 0 && targetLine < txtBox1.Lines.Length)
{
    // 获取该行的起始字符索引
    int selectionStart = txtBox1.GetFirstCharIndexFromLine(targetLine);
    // 获取该行的实际长度,实现整行高亮
    int selectionLength = txtBox1.Lines[targetLine].Length;

    txtBox1.SelectionStart = selectionStart;
    txtBox1.SelectionLength = selectionLength;
    // 强制保持高亮,即使控件暂时失焦
    txtBox1.HideSelection = false;
    // 聚焦到TextBox并滚动到选中行
    txtBox1.Focus();
    txtBox1.ScrollToCaret();
}

额外提醒:如果用的是Newtonsoft.Json,记得把exceptionObject.Lineposition换成exceptionObject.LineNumber,别搞混属性名哦。

内容的提问来源于stack exchange,提问作者dev kolkata

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:33:07