2

richtextbox テキストの最後の '{' と '}' の間のテキストを選択したいと考えています。次のコードがありますが、「LastIndexOf」関数にエラーがあり、修正方法がわかりません。誰か助けてくれませんか?

    private void highlightText()
    {
        mRtbxOperations.SelectionStart = mRtbxOperations.Text.LastIndexOf(@"{", 1, mRtbxOperations.SelectionStart);
        mRtbxOperations.SelectionLength = mRtbxOperations.Text.IndexOf(@"}", mRtbxOperations.SelectionStart, mRtbxOperations.Text.Length - 1);
        mRtbxOperations.SelectionBackColor = Color.LightBlue;
        mRtbxOperations.SelectionFont = new Font(mRtbxOperations.SelectionFont, FontStyle.Underline);
        mRtbxOperations.SelectionLength = 0;
    }

LastIndexOf エラー:

カウントは正でなければならず、文字列、配列、またはコレクション内の場所を参照する必要があります。パラメータ名:カウント

4

2 に答える 2

1

テキストの境界から外れているようです。部分文字列またはインデックスを取得する場合は、常に文字列境界または部分文字列境界を使用する必要があります。また、選択が有効であることを確認する必要があります。

私はあなたのコードを次のように書き直します:

    private void highlightText()
    {
        Selection selection = GetSelection(mRtbxOperations.Text);
        if (selection == null)
            return;
        mRtbxOperations.SelectionStart = selection.Start;
        mRtbxOperations.SelectionLength = selection.Length;
        mRtbxOperations.SelectionBackColor = Color.LightBlue;
        mRtbxOperations.SelectionFont = new Font(mRtbxOperations.SelectionFont,   
            FontStyle.Underline);
    }

    private static Selection GetSelection(string text)
    {
        int sIndex = text.LastIndexOf(@"{");
        if (sIndex == -1)
            return null;
        int eIndex = text.IndexOf(@"}", sIndex);
        if (eIndex == -1)
            return null;

        return new Selection(sIndex + 1, eIndex);
    }

    public class Selection
    {
        public int Start { get; set; }
        public int End { get; set; }

        public int Length
        {
            get
            {
                return End - Start;
            }
        }

        public Selection(int startIndex, int endIndex)
        {
            this.Start = startIndex;
            this.End = endIndex;
        }
    }
于 2014-03-19T13:35:32.023 に答える
1

LastIndexOf パラメータと、適切な長さを取得するために開始点を減算する必要がある選択範囲の長さを台無しにします。

より単純なバージョンを試してください:

int textStart = mRtbxOperations.Text.LastIndexOf(@"{",
                                                 mRtbxOperations.SelectionStart);
if (textStart > -1) {
  int textEnd = mRtbxOperations.Text.IndexOf(@"}", textStart);
  if (textEnd > -1) {
    mRtbxOperations.Select(textStart, textEnd - textStart + 1);
    mRtbxOperations.SelectionBackColor = Color.LightBlue;
  }
}
于 2014-03-19T13:43:20.047 に答える