*对不起,如果标题不是很好。我不知道如何用几句话来概括这个问题。
我有一个DataGridView
和一个搜索框。当用户键入查询时,DataGridView
单元格中的任何匹配结果都会突出显示。为了实现这一点,我使用了CellPainting
事件DataGridView
并在结果后面绘制了一个矩形。
一些单元格是从右到左的:
有些是从左到右的:
当方向为 RTL 时,我使用以下公式计算高亮矩形 X 坐标:
e.CellBounds.Right - queryWidth - stringBeforeQueryWidth;
并stringBeforeQueryWidth
指的是:
当方向为 LTR 时,我使用以下公式:
e.CellBounds.Left + stringBeforeQueryWidth;
并stringBeforeQueryWidth
指的是:
我的计算方式stringBeforeQueryWidth
如下:
var stringBeforeQuery = cellValue.Substring(0, cellValue.IndexOf(query));
var stringBeforeQueryWidth =
e.Graphics.MeasureString(stringBeforeQuery, font, e.CellBounds.Width, format).Width;
所以当方向是 RTL 时,我使用查询本身之前的所有字符都将绘制到它的右侧的事实,当方向是 LTR 时,我使用查询之前的所有字符的事实本身将被绘制到它的左侧。
当单元格包含一个组合 LTR 和 RTL 文本的字符串时,问题就开始了。例如:
假设查询是13
. 要计算stringBeforeQueryWidth
我需要的宽度רחוב ישראל ישראלי
和宽度/5
。我不能用它cellValue.Substring(0, cellValue.IndexOf(query))
来检索它们,就像我在只有一个方向时所做的那样,因为רחוב ישראל ישראלי
它在查询之前,在查询/5
之后。
那么如何获取位于查询右侧的字符串部分的宽度呢?