7

番号付きリスト機能をテキストエディタに追加しようとしています。RichTextboxにはSelectionBullet、選択範囲を箇条書きに変更するためのプロパティが既に用意されています。しかし、番号付きリストを生成するための同様のプロパティを見つけることができませんでした。Richtextboxで番号付きリストを作成する標準的な方法はありますか?そうでない場合は、自分で実装する必要があるので、それを行うのに役立つコードスニップが役立ちます。ありがとうございます。

4

3 に答える 3

4

リンクが一般的に良い答えとして受け入れられていないことは知っていますが、CodeProjectの検索行番号、箇条書き、印刷、検索サポートを備えたRichTextBoxの記事は、おそらくあなたが探しているものでかなり役立つでしょう。

この記事では、作成者はRichTextBoxコントロールを、あなたが求めていること(およびそれ以上)を実行できるものに拡張します。さらに、コードはそこに投稿され、すべての人が見ることができます。

于 2012-11-02T16:19:48.803 に答える
1

さて、私はそれを次のように実装しました。

  private void btnNumbers_Click(object sender, EventArgs e)
        {
            string temptext = rtbMain.SelectedText;

            int SelectionStart = rtbMain.SelectionStart;
            int SelectionLength = rtbMain.SelectionLength;

            rtbMain.SelectionStart = rtbMain.GetFirstCharIndexOfCurrentLine();
            rtbMain.SelectionLength = 0;
            rtbMain.SelectedText = "1. ";

            int j = 2;
            for( int i = SelectionStart; i < SelectionStart + SelectionLength; i++)
                if (rtbMain.Text[i] == '\n')
                {
                    rtbMain.SelectionStart = i + 1;
                    rtbMain.SelectionLength = 0;
                    rtbMain.SelectedText = j.ToString() + ". ";
                    j++;
                    SelectionLength += 3;
                }

        }

        private void rtbMain_KeyDown(object sender, KeyEventArgs e)
        {//this piece of code automatically increments the bulleted list when user //presses Enter key
            int tempNum;
            if (e.KeyCode == Keys.Enter)
                try
                    {
                        if (char.IsDigit(rtbMain.Text[rtbMain.GetFirstCharIndexOfCurrentLine()]))
                        {
                            if (char.IsDigit(rtbMain.Text[rtbMain.GetFirstCharIndexOfCurrentLine() + 1]) && rtbMain.Text[rtbMain.GetFirstCharIndexOfCurrentLine() + 2] == '.')
                                tempNum = int.Parse(rtbMain.Text.Substring(rtbMain.GetFirstCharIndexOfCurrentLine(),2));
                            else tempNum = int.Parse(rtbMain.Text[rtbMain.GetFirstCharIndexOfCurrentLine()].ToString());

                            if (rtbMain.Text[rtbMain.GetFirstCharIndexOfCurrentLine() + 1] == '.' || (char.IsDigit(rtbMain.Text[rtbMain.GetFirstCharIndexOfCurrentLine() + 1]) && rtbMain.Text[rtbMain.GetFirstCharIndexOfCurrentLine() + 2] == '.'))
                            {
                                tempNum++;
                                    rtbMain.SelectedText = "\r\n" + tempNum.ToString() + ". ";
                                e.SuppressKeyPress = true;
                            }
                        }  
                    }
                 catch{}
        }
于 2012-11-02T18:35:07.727 に答える
0

これが私の答えです...これは読みやすく、洗練されています。私は非常に異なるアプローチを取りましたが、選択範囲内の番号付きリストがすでに存在する場合はそれを削除する機能を追加しました。これまでのところ、私はそれを軽くテストしただけで、うまく機能しているように見えることに注意してください...しかし、さらに改良が必要な場合があります。

    private void btnOrdered_Click(object sender, EventArgs e)
    {
        string[] splitSelection = null;
        // If selection split selection else split everything
        if (this.txtCaptionEditor.SelectionLength > 0)
        {
            splitSelection = this.txtCaptionEditor.SelectedText.Replace("\r\n", "\n").Split("\n".ToCharArray());
        }
        else
        {
            splitSelection = this.txtCaptionEditor.Text.Replace("\r\n", "\n").Split("\n".ToCharArray());
        }
        bool Exists = false;
        for (int i = 0; i < splitSelection.GetLength(0); i++)
        {
            // If Ordered List Allready exists in selection then remove else add
            if (!string.IsNullOrEmpty(splitSelection[i]))
            {
                if (splitSelection[i].Substring(0, 2) == "1.") { Exists = true; }
            }
        }

        for (int i = 0; i < splitSelection.GetLength(0); i++)
        {
            int lineCount = (i + 1);
            if (Exists)
            {
                this.txtCaptionEditor.Text = this.txtCaptionEditor.Text.Replace(Convert.ToString(lineCount) + ".  ", "");
            }
            else
            {
                if(!string.IsNullOrEmpty(splitSelection[i]))
                {
                    this.txtCaptionEditor.Text = this.txtCaptionEditor.Text.Replace(splitSelection[i], Convert.ToString(lineCount) + ".  " + splitSelection[i]);
                }

            }
        }
    }

    private void txtCaptionEditor_KeyDown(object sender, KeyEventArgs e)
    {
        string[] splitSelection = this.txtCaptionEditor.Text.Replace("\r\n", "\n").Split("\n".ToCharArray());
        if (e.KeyCode == Keys.Enter)
        {
            // Get Current Line Position
            int currentLine = this.txtCaptionEditor.GetLineFromCharIndex(this.txtCaptionEditor.SelectionStart);
            // Only Run if the previous line is greater than zero
            if ((currentLine) >= 0)
            {
                // Loop through 100 possible numbers for match you can go higher 
                // If you think your numbered list could go above 100
                for (int i = 0; i < 100; i++)
                {
                    if (splitSelection[(currentLine)].Substring(0, 2) == Convert.ToString((i + 1)) + ".")
                    {
                        // If the substring of the current line equals a numbered list                value.. enumerate next line
                        this.txtCaptionEditor.SelectedText = "\n" + (i + 2) + ".  ";
                        e.SuppressKeyPress = true;
                    }
                }
            }
        }
    }
于 2013-09-03T22:54:11.443 に答える