posts - 124,  comments - 29,  trackbacks - 0
  1using System;
  2using System.Collections.Generic;
  3using System.ComponentModel;
  4using System.Data;
  5using System.Drawing;
  6using System.Text;
  7using System.Windows.Forms;
  8
  9namespace VSGround
 10{
 11    public partial class Form1 : Form
 12    {
 13        public Form1()
 14        {
 15            InitializeComponent();
 16        }

 17
 18        private void Form1_Load(object sender, EventArgs e)
 19        {
 20            txtInput.Focus();
 21            //txt2.TabIndex = 0;
 22        }

 23        private int GetRNCount(String str)
 24        {
 25            int RNnum = 0;
 26            for(int i = 0; i<str.Length; i++)
 27            {
 28                if (str[i] == '\r')
 29                {
 30                    RNnum++;
 31                }

 32            }

 33            return RNnum;
 34        }

 35        //根据行号确定光标索引
 36        private int GetCurIndex(int curRow)
 37        {
 38            int curIndex = 0;
 39            if (curRow < 10)
 40            {
 41                curIndex = 3 * (curRow - 1);
 42            }

 43            else if (curRow < 100)
 44            {
 45                curIndex = (10 - 1* 3  + (curRow - 10* 4;
 46            }

 47            else if (curRow < 1000)
 48            {
 49                curIndex = (10 - 1* 3  + (100-1* 4 + (curRow - 100)*5;
 50            }

 51            else if (curRow < 10000)
 52            {
 53                curIndex = (10 - 1* 3 + (100 - 1* 4 + (1000 - 1* 5 + (curRow - 1000* 6;
 54            }

 55            else
 56            {
 57                curIndex = (10 - 1* 3 + (100 - 1* 4 + (1000 - 1* 5 + (10000 - 1* 6 + (curRow - 10000* 7;
 58            }

 59            return curIndex;
 60        }

 61        private void txtInput_TextChanged(object sender, EventArgs e)
 62        {
 63            txtLeft.Clear();
 64            //两个textbox中的滚动条保持同步
 65            txtInput.ScrollToCaret();
 66
 67            //定位总行号
 68            String str = txtInput.Text;
 69            if (str != null && str.Length > 0)
 70            {
 71                int countRN = GetRNCount(str);
 72                for(int j = 0; j < countRN+1; j++)
 73                {
 74                    txtLeft.Text += (j + 1).ToString();
 75                    txtLeft.Text += "\r\n";
 76                }

 77                txtLeft.Text = txtLeft.Text.Substring(0, txtLeft.Text.Length - 2);
 78
 79            }

 80            //定位光标所在行号取其前面的子串
 81            int careIndex = txtInput.SelectionStart;
 82            String careFrontStr = txtInput.Text.Substring(0, careIndex);
 83            //分析子串有几个回车换行符
 84            int countSubRN = GetRNCount(careFrontStr);
 85            int CurRow = countSubRN + 1;
 86            txtLeft.SelectionStart = GetCurIndex(CurRow);
 87            txtLeft.ScrollToCaret();
 88        }

 89
 90        private void txtInput_KeyDown(object sender, KeyEventArgs e)
 91        {
 92            txtInput.ScrollToCaret();
 93            if(e.KeyCode == Keys.Up)
 94            {
 95                //定位光标所在行号取其前面的子串
 96                int careIndex = txtInput.SelectionStart;
 97                String careFrontStr = txtInput.Text.Substring(0, careIndex);
 98                //分析子串有几个回车换行符
 99                int countSubRN = GetRNCount(careFrontStr);
100                int CurRow = countSubRN ;
101                if(CurRow != 0)
102                {
103                    txtLeft.SelectionStart = GetCurIndex(CurRow);
104                }

105                else
106                {
107                    txtLeft.SelectionStart = GetCurIndex(CurRow+1);
108                }

109              
110                txtLeft.ScrollToCaret();
111            }

112            else if(e.KeyCode == Keys.Down)
113            {
114                                //定位光标所在行号取其前面的子串
115                int careIndex = txtInput.SelectionStart;
116                String careFrontStr = txtInput.Text.Substring(0, careIndex);
117                //分析子串有几个回车换行符
118                int countSubRN = GetRNCount(careFrontStr);
119                int CurRow = countSubRN ;
120                txtLeft.SelectionStart = GetCurIndex(CurRow + 2);
121                txtLeft.ScrollToCaret();
122            }

123        }

124    }

125}

 1using System;
 2using System.Collections.Generic;
 3using System.Windows.Forms;
 4using System.Text;
 5
 6namespace VSGround
 7{
 8    class MyTextBox:System.Windows.Forms.TextBox
 9    {
10        public MyTextBox():base()
11        {
12
13        }

14        protected override bool IsInputKey(System.Windows.Forms.Keys KeyData)
15        {
16            if (KeyData == System.Windows.Forms.Keys.Up ||
17                KeyData == System.Windows.Forms.Keys.Down)
18            return true;
19        return base.IsInputKey(KeyData);
20        }

21    }

22}
posted on 2008-09-12 16:52 天书 阅读(2110) 评论(1)  编辑 收藏 引用

FeedBack:
# re: c# 两个TextBox 同步滚动 实现行号功能
2013-06-17 10:31 | 请输入你的姓名
提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理



<2009年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(5)

随笔档案

文章分类

文章档案

好友的Bolg

搜索

  •  

最新评论

阅读排行榜

评论排行榜