* Извините, если название не очень. Я не уверен, как обобщить этот вопрос в нескольких словах.
У меня есть 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
— после запроса.
Итак, как я могу получить ширину части строки, расположенной справа от запроса?
queryWidth
— это предварительно рассчитанная ширина самого запроса с использованиемe.Graphics.MeasureString()
. - person Sipo   schedule 07.02.2019TextBox
, а ячейкаDataGridView
. Если у вас есть решение для кода, поделитесь им в ответе. Спасибо за ваше время. - person Sipo   schedule 07.02.2019.MeasureCharacterRanges
может помочь, если он поддерживает биди. - person Jeroen Mostert   schedule 07.02.2019MeasureString
у меня не работает, просто я не могу понять, какую строку в нее передать... Как мне изолировать все символы, которые визуально находятся справа от запроса? - person Sipo   schedule 07.02.2019.MeasureCharacterRanges
позволит вам просто захватить область, где находится текст для выделения (используя пользовательскийCharacterRanges
), поскольку именно здесь вы собираетесь рисовать прямоугольник..MeasureString
не может знать о происходящем смешивании биди, потому что остальная часть строки вырезана, но.MeasureCharacterRanges
может (хотя, как я уже сказал, я не знаю, делает ли это на самом деле). - person Jeroen Mostert   schedule 07.02.2019MeasuerCharacterRanges
. Та же проблема. - person Sipo   schedule 08.02.2019