Номера текущей строки и столбца в RichTextBox в приложении Winforms - PullRequest
7 голосов
/ 11 марта 2010

Как получить текущие номера строк и столбцов в RichTextBox в приложении Winforms?

Примечание

Ребята, я просто хочу простое решение, если оно кем-то доступно, и он готов поделиться им с нами, а не ссылками для исследований! Просто дайте мне код, пожалуйста! В противном случае мне придется купить контроль ...

Ответы [ 3 ]

17 голосов
/ 29 июля 2011

Думал, что выложу немного более простой способ сделать это.

// Get the line.
int index = richTextBox.SelectionStart;
int line = richTextBox.GetLineFromCharIndex(index);

// Get the column.
int firstChar = richTextBox.GetFirstCharIndexFromLine(line);
int column = index - firstChar;

Получить текущий выбранный индекс, получить текущую строку, а затем получить столбец, вычесть выбранный индекс из индекса первого символа этой строки.

1 голос
/ 11 марта 2010

Для строк и столбцов ознакомьтесь с проектом Richer RichTextBox . Это расширенная версия RichTextBox, которая поддерживает номера строк и столбцов. Код из статьи:

this.rtb.CursorPositionChanged += 
    new System.EventHandler(this.rtb_CursorPositionChanged);
this.rtb.SelectionChanged += 
    new System.EventHandler(this.rtb_SelectionChanged);
.
.
.
private void rtb_CursorPositionChanged(object sender, System.EventArgs e)
{
    int line = rtb.CurrentLine;
    int col = rtb.CurrentColumn;
    int pos = rtb.CurrentPosition;

    statusBar.Text = "Line " + line + ", Col " + col + 
                     ", Position " + pos;
}

private void rtb_SelectionChanged(object sender, System.EventArgs e)
{
    int start = rtb.SelectionStart;
    int end = rtb.SelectionEnd;
    int length = rtb.SelectionLength;

    statusBar.Text = "Start " + start + ", End " + end + 
                     ", Length " + length;
}

Чтобы добиться такого поведения, нам нужно расширить класс RichTextBox следующим образом:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace Nik.UserControls
{
    public class RicherTextBox2 : System.Windows.Forms.RichTextBox
    {
        public event EventHandler CursorPositionChanged;

        protected virtual void OnCursorPositionChanged( EventArgs e )
        {
            if ( CursorPositionChanged != null )
                CursorPositionChanged( this, e );
        }

        protected override void OnSelectionChanged( EventArgs e )
        {
            if ( SelectionLength == 0 )
                OnCursorPositionChanged( e );
            else
                base.OnSelectionChanged( e );
        }

        public int CurrentColumn
        {
            get { return CursorPosition.Column( this, SelectionStart ); }
        }

        public int CurrentLine
        {
            get { return CursorPosition.Line( this, SelectionStart ); }
        }

        public int CurrentPosition
        {
            get { return this.SelectionStart; }
        }

        public int SelectionEnd
        {
            get { return SelectionStart + SelectionLength; }
        }
    }

    internal class CursorPosition
    {
        [System.Runtime.InteropServices.DllImport("user32")] 
        public static extern int GetCaretPos(ref Point lpPoint);

        private static int GetCorrection(RichTextBox e, int index)
        {
            Point pt1 = Point.Empty;
            GetCaretPos(ref pt1);
            Point pt2 = e.GetPositionFromCharIndex(index);

            if ( pt1 != pt2 )
                return 1;
            else
                return 0;
        }

        public static int Line( RichTextBox e, int index )
        {
             int correction = GetCorrection( e, index );
             return e.GetLineFromCharIndex( index ) - correction + 1;
        }

        public static int Column( RichTextBox e, int index1 )
        {
             int correction = GetCorrection( e, index1 );
             Point p = e.GetPositionFromCharIndex( index1 - correction );

             if ( p.X == 1 )
                 return 1;

             p.X = 0;
             int index2 = e.GetCharIndexFromPosition( p );

             int col = index1 - index2 + 1;

             return col;
         }
    }
}

Отображение номера строки в RichTextBox для части номера строки.

0 голосов
...