код не всегда выделяет выделенный текст в richtextbox - PullRequest
0 голосов
/ 16 мая 2019

richTextBox1 содержит текст, который я нажимаю на слове, и консоль отображает это слово для меня, и он выделяет / выбирает слово, на которое я нажал.

Для этого я сохраняю индекс символа, на котором щелкнулидите налево и направо, пока я не нажму пробел, -1 или конец файла.Теперь у меня есть индексы начала и конца слова.Предполагается, что в последних двух строках слово выбирается между этими двумя индексами.

Однако бывает так, что иногда оно выделяет нужное мне слово, а иногда выделяет все слова справа от символа, на котором я щелкнул,

"omar hello, куда ты идешь"
Если я нажму на h в hello, он подскажет привет, где вместо выделения hello
Если я нажму на o при переходе, он будет выделять движение только какон должен
Если я нажму на o в вас, это будет означать, что вы идете

Я использовал консоль, чтобы проверить начальный и конечный индексы слова, и они всегда по какой-то причине все же правильны, другие словавыбраны в дополнение к слову, на котором я щелкнул

private void richTextBox1_Click(object sender, EventArgs e)
{
    int length = richTextBox1.Text.Length;
    int rightPart = richTextBox1.SelectionStart;
    int leftPart = richTextBox1.SelectionStart - 1;
    string rightText = "";
    string leftText = "";

    while (rightPart != length)
    {
        if (richTextBox1.Text[rightPart].ToString().CompareTo(" ") != 0)
        {
            rightText += richTextBox1.Text[rightPart];
            rightPart++;
        }

        else
        {
            break;
        }
    }

    while (leftPart != -1)
    {
        if (richTextBox1.Text[leftPart].ToString().CompareTo(" ") != 0)
        {
            leftText = richTextBox1.Text[leftPart] + leftText;
            leftPart--;
        }

        else
        {
            break;
        }
    }

    leftPart++;
    Console.WriteLine("\nSelected word is " + leftText + rightText + "\n");

    richTextBox1.SelectionStart = leftPart;
    richTextBox1.SelectionLength = rightPart;       
}

1 Ответ

0 голосов
/ 16 мая 2019

Проблема заключается в том, что вы устанавливаете SelectionLength равным rightPart. Помните, что это свойство представляет длину выбора, а не последний индекс выбора.

Вместо этого попробуйте изменить код для расчета длины, получая разницу между leftPart и rightPart:

richTextBox1.SelectionLength = rightPart - leftPart;

Ваш код может быть немного сокращен:

private void richTextBox1_Click(object sender, EventArgs e)
{
    if (richTextBox1.TextLength == 0) return;
    int rightPart = richTextBox1.SelectionStart;
    int leftPart = richTextBox1.SelectionStart - 1;

    while (rightPart < richTextBox1.TextLength && richTextBox1.Text[rightPart] != ' ') 
    {
        rightPart++;
    }

    while (leftPart > -1 && richTextBox1.Text[leftPart] != ' ') 
    {
        leftPart--;
    }

    leftPart++;

    Console.WriteLine($"\nSelected word is " + 
        richTextBox1.Text.Substring(leftPart, rightPart - leftPart) + "\n");

    richTextBox1.SelectionStart = leftPart;
    richTextBox1.SelectionLength = rightPart - leftPart;
}

Или даже немного больше, используя IndexOf и LastIndexOf вместо циклов для поиска пробелов:

private void richTextBox1_Click(object sender, EventArgs e)
{
    if (richTextBox1.TextLength == 0) return;

    // Find the space before this word and after this word
    var selStart = Math.Min(richTextBox1.SelectionStart, richTextBox1.TextLength - 1);
    var firstSpace = richTextBox1.Text.LastIndexOf(' ', selStart);
    var lastSpace = richTextBox1.Text.IndexOf(' ', selStart);

    var start = firstSpace + 1;
    var length = (lastSpace < 0 ? richTextBox1.TextLength : lastSpace) - start;

    Console.WriteLine($"\nSelected word is {richTextBox1.Text.Substring(start, length)} \n");

    richTextBox1.SelectionStart = start;
    richTextBox1.SelectionLength = length;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...