0

我不确定为什么这会引发异常。此代码应该获取光标位置然后获取最后一个空格索引或输入以选择最后一个键入的单词。它有时会抛出超出范围的异常。选择起始值是否会高于字符串中的字符数?我不确定究竟是什么原因造成的。我放了 if 语句以避免对不存在的字符进行索引......但这并没有以一种或另一种方式改善或恶化它。

        private string word()
    {
        char[] array1 = { '\n', ' ' };
        int end = textBox1.SelectionStart;
        int strt = 0;
        if (textBox1.Text.LastIndexOfAny(array1)!=-1)
        {
             strt = textBox1.Text.LastIndexOfAny(array1,end);
        }



        if (strt==-1) { strt = 0; }

        return textBox1.Text.Substring(strt, end - strt);

    }

在此处输入图像描述

4

3 回答 3

1

根据MSDN

String.LastIndexOfAny Method (Char[], Int32)报告在 Unicode 数组中指定的一个或多个字符的此实例中最后一次出现的从零开始的索引位置。搜索从指定的字符位置开始,然后向后向字符串的开头进行。

在您的情况下,textBox1.SelectionStart将为您提供光标在文本框中的当前位置。让 TextBox 中的字符串为"sampl"且光标位于文本末尾,因此 SelectionStart 将为您提供 value 5。请注意,框中的字符串是有长度的,5但它在索引处没有字符,5因为它遵循0基于索引。

因此,在访问此代码strt = textBox1.Text.LastIndexOfAny(array1,end);时,5它不是字符串中的有效索引。这导致了这里的错误。

因此,使用以下几行来获取光标位置(end),然后您的代码将按预期工作

int end = 0;
if (textBox1.Text.Length > 1)
    end = textBox1.SelectionStart - 1;
于 2016-06-16T04:23:15.223 回答
0

通常,当startIndex指定不在此实例中的位置时,您会收到此异常。

因此,请检查end您的情况下的值并确保它小于textBox1.Text.Length

于 2016-06-16T04:21:06.623 回答
0

尝试将第一次LastIndexOfAny()调用存储到局部变量中,然后从中减去它end以获得第二次调用的值LastIndexOfAny()

private string word()
{
    char[] array1 = { '\n', ' ' };
    int end = textBox1.SelectionStart;
    int strt = 0;
    var lastIndex = textBox1.Text.LastIndexOfAny(array1);
    if (lastIndex !=-1)
    {
         strt = textBox1.Text.LastIndexOfAny(array1, end - lastIndex);
    }



    if (strt==-1) { strt = 0; }

    return textBox1.Text.Substring(strt, end - strt);

}
于 2016-06-16T04:26:34.923 回答