* Извините, если название не велико.Я не уверен, как можно обобщить этот вопрос в несколько слов.
У меня есть 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, я использую тот факт, что все символы, которые предшествуют самому запросу, будут нарисованы слева от него.
Проблема начинается, когда ячейка cсодержит строку, которая объединяет тексты LTR и RTL.Например:
Скажем, запрос 13
.Для вычисления stringBeforeQueryWidth
мне нужна ширина רחוב ישראל ישראלי
и ширина /5
.Я не могу использовать cellValue.Substring(0, cellValue.IndexOf(query))
для их извлечения, как я делал, когда была только одна ориентация, потому что רחוב ישראל ישראלי
предшествует запросу, а /5
идет после запроса.
Так, как я могу получить ширину части строки, которая расположена справа от запроса?