准确获取RichTextBox的行数

     本次采用了三种方法获取行数:

1、通过使用 Graphics 类的 MeasureString 方法来测量文本的高度并将其除以单行的高度。

        int lineCount1 = (int)(rtbResult.CreateGraphics().MeasureString(rtbResult.Text, rtbResult.Font).Height / rtbResult.Font.Height + 1);

2、使用 GetLineFromCharIndex 方法获取 RichTextBox 中最后一个字符的行号,获取总行数。

        int lineCount2 = rtbResult.GetLineFromCharIndex(rtbResult.TextLength);

3、直接获取控件的行数的长度。

       int lineCount3 = rtbResult.Lines.Length;

在RichTextBox中的文本没有自动换行时,三种方法求得的行数如下所示:

 在RichTextBox中的文本有自动换行时,三种方法求得的行数如下所示:

 总结后可得,第二种方法能准确的获取 RichTextBox 中文本的行数,无论是否启用自动换行;第一种方法在没有自动换行的情况下能准确的获取 RichTextBox 中文本的行数,带自动换行的情况下,获取的是忽略掉自动换行的情况下的文本行数;第三种和第一种方法相同,获取的行数比第一种多1(猜测应该是包括光标所在的那一行)。

控制RichTextBox行数一定的程序如下:

BeginInvoke(new Action(() =>
                {
                    
                    rtbResult.SelectionStart = rtbResult.Text.Length;
                    rtbResult.SelectionLength = message.Length;
                    rtbResult.SelectionColor = color;
                    rtbResult.AppendText(DateTime.Now.ToString("HH:mm:ss ") + message);
                    //rtbResult.AppendText(message);
                    rtbResult.AppendText("\r\n");
                    rtbResult.SelectionStart = rtbResult.TextLength;
                    rtbResult.ScrollToCaret();

                    //int lineCount = (int)(rtbResult.CreateGraphics().MeasureString(rtbResult.Text, rtbResult.Font).Height / rtbResult.Font.Height + 1);
                    //tbResultLineNum0.Text = Convert.ToString(lineCount);
                    int lineCount = rtbResult.GetLineFromCharIndex(rtbResult.TextLength);
                    tbResultLineNum0.Text = Convert.ToString(lineCount);
                    if (lineCount >= 10)
                    {

                        //rtbResult.Clear();
                        //获取指定行的第一行的第一个字符的索引
                        int start = rtbResult.GetFirstCharIndexFromLine(1 - 1);

                        //获取指定行的最后一行的第一个字符的索引
                        int end = rtbResult.GetFirstCharIndexFromLine(lineCount - 10);
                        rtbResult.Select(start, end - start);//选中指定行
                        int a = rtbResult.SelectedText.Length;
                        rtbResult.SelectedText = "";//设置选择行的内容为空

                        //tbResultLineNum.Text = Convert.ToString(rtbResult.GetLineFromCharIndex(rtbResult.TextLength)+1);                   
                    }

                    int lineCount1 = (int)(rtbResult.CreateGraphics().MeasureString(rtbResult.Text, rtbResult.Font).Height / rtbResult.Font.Height + 1);
                    tbResultLineNum.Text = Convert.ToString(lineCount1);

                    int lineCount2 = rtbResult.GetLineFromCharIndex(rtbResult.TextLength);
                    tbResultLineNum1.Text = Convert.ToString(lineCount2);

                    int lineCount3 = rtbResult.Lines.Length;
                    tbResultLineNum2.Text = Convert.ToString(lineCount3);
                }));
                
            }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值