WinForms C#中TextBox错误行高亮功能失效问题求助
我在解析一段JSON内容时,想在出错时自动高亮TextBox里错误所在的行,但试了一段代码却没效果。
待解析的JSON:
{ "datalist": { "name":"abc", "collegename":"xyz", "degree":"123" } }
我写的代码:
txtBox1.SelectionStart = txtBox1.GetFirstCharIndexFromLine(exceptionObject.Lineposition); txtBox1.SelectionLength = 10; txtBox1.setFocus();
咱们来一步步排查问题,大概率是这几个细节没处理到位:
行号索引不匹配
TextBox的GetFirstCharIndexFromLine是从0开始计数的,但多数JSON解析库返回的错误行号是从1开始的(比如Newtonsoft.Json的JsonReaderException.LineNumber)。如果你的exceptionObject.Lineposition是从1起始的,直接传值就会定位到错误的行,自然看不到高亮效果。固定选中长度不合理
你设置了SelectionLength = 10,但错误行的实际长度可能远大于或小于10,要么没覆盖整行,要么选中了无关内容。应该获取对应行的真实长度来实现整行高亮。HideSelection属性的默认坑
TextBox的HideSelection属性默认是true,意思是控件失焦时选中内容会隐藏。哪怕调用了Focus(),有时候也会因为UI线程延迟导致高亮不显示,所以得把这个属性设为false。异常属性名可能搞错
不同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

