C# RichTextBox 获取当前光标的行号列号

相对于API得到的数值,这个方法或许好很多,如果是很长很多行的文本(如:五笔词库),API会有溢出,得到的是个莫名其妙的数值,令人抓狂。

  GetFirstCharIndexOfCurrentLine() 方法可以快速得到光标行的索引,而不需遍历所有的字符是否为"\r\n",有上亿字符的话,可能遍历到让人吐血。

获得行和列的快速方法要用到  GetFirstCharIndexOfCurrentLine()、.GetLineFromCharIndex(int  index)、SelectionStart

自定义一个方法  Ranks()   方便调用

        /// 自定义方法 -- 
        ///  获取文本中(行和列)--光标--坐标位置的调用方法
        /// 
        /// 
        /// 
        private void Ranks()
        {         
            /*  得到光标行第一个字符的索引,
             *  即从第1个字符开始到光标行的第1个字符索引*/           
            int index = richTextBox1.GetFirstCharIndexOfCurrentLine();
            /*  得到光标行的行号,第1行从0开始计算,习惯上我们是从1开始计算,所以+1。 */
            int line = richTextBox1.GetLineFromCharIndex(index) + 1;
            /*  SelectionStart得到光标所在位置的索引
             *  再减去
             *  当前行第一个字符的索引
             *  = 光标所在的列数(从0开始)  */
            int column = richTextBox1.SelectionStart - index + 1;
            /*  选择打印输出的控件  */
            this.label1.Text = string.Format("第:{0}行 {1}列", line.ToString(), column.ToString());
        }
完整代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Ranks
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        /// 自定义方法 -- 
        ///  获取文本中(行和列)--光标--坐标位置的调用方法
        /// 
        /// 
        /// 
        private void Ranks()
        {
            /*  得到光标行第一个字符的索引,
             *  即从第1个字符开始到光标行的第1个字符索引*/
            int index = richTextBox1.GetFirstCharIndexOfCurrentLine();
            /*得到光标行的行号,第1行从0开始计算,习惯上我们是从1开始计算,所以+1。 */
            int line = richTextBox1.GetLineFromCharIndex(index) + 1;
            /*  SelectionStart得到光标所在位置的索引
             *  再减去
             *  当前行第一个字符的索引
             *  = 光标所在的列数(从0开始)  */
            int column = richTextBox1.SelectionStart - index + 1;
            this.label1.Text = string.Format("第:{0}行 {1}列", line.ToString(), column.ToString());
        }

        private void richTextBox1_KeyUp(object sender, KeyEventArgs e)
        {
            this.Ranks();  //按上、下、左、右时显示
        }

        private void richTextBox1_MouseUp(object sender, MouseEventArgs e)
        {
            this.Ranks();  //点击鼠标时显示
        }
    }
}

对你有用请给个评价,没用请一笑而过!!





你可能感兴趣的:(.NET/C#)