捕获DataGridView滚动到最后的事件

DataGridView提供了Scroll事件,ScrollEventArgs参数提供了:

NewValue 获取或设置滚动条的新 Value。 
OldValue 获取滚动条的旧 Value 值。 
ScrollOrientation 获取引发 Scroll 事件的滚动条方向。 
Type 获取所发生的滚动事件的类型。

虽然Type中有First和Last,但在DataGridView似乎没有作用。因此无法根据Type来判断是否滚动到最后。

NewValue是DataGridView第一个可见行的索引,因此当(NewValue>=总行数-可见行数)时即滚动到最后。

下面代码在滚动条滚动到最后时自动在 DataGridView中增加100行数据:

public partial class DGVScrollToEndForm : Form
    {
        //最后加载时间,防止加载时自动滚动引发Scrooll事件而又引发加载
        private DateTime lastLoading;
        //保存加载前第一个可见行索引并在加载后重新设置它为第一个可见行
        private int firstVisibleRow;
        //保存DataGridView滚动条
        private ScrollBars gridScrollBars;

        public DGVScrollToEndForm()
        {
            InitializeComponent();
            //注册事件
            dataGridView1.Scroll += new ScrollEventHandler(dataGridView1_Scroll);

            //加载前100行数据
            LoadRows();

        }

        /// <summary>
        /// 保存并隐藏滚动条在加载后更新
        /// 防止加载时的自动滚动引发不必要的事件
        /// </summary>
        private void HideScrollBars()
        {
            gridScrollBars = dataGridView1.ScrollBars;
            dataGridView1.ScrollBars = ScrollBars.None;
        }

        /// <summary>
        /// 显示滚动条
        /// </summary>
        private void ShowScrollBars()
        {
            dataGridView1.ScrollBars = gridScrollBars;
        }

        /// <summary>
        /// 计算可见行数量
        /// </summary>
        /// <returns></returns>
        private int GetDisplayedRowsCount()
        {
            int count = dataGridView1.Rows[dataGridView1.FirstDisplayedScrollingRowIndex].Height;
            count = dataGridView1.Height / count;
            return count;
        }

        /// <summary>
        /// 加载数据
        /// </summary>
        private void LoadRows()
        {
            HideScrollBars();

            System.Diagnostics.Debug.WriteLine("Load data");
            lastLoading = DateTime.Now;


            //创建行
            for (int i = 0; i < 100; i++)
            {
                int n = dataGridView1.Rows.Add();
                dataGridView1.Rows[n].Cells[0].Value = "Row - " + n.ToString();
            }

            //还原第一个可见行显示
            if (firstVisibleRow > -1)
            {
                ShowScrollBars();
                dataGridView1.FirstDisplayedScrollingRowIndex = firstVisibleRow;
            }
        }

        void dataGridView1_Scroll(object sender, ScrollEventArgs e)
        {
            if (e.Type == ScrollEventType.SmallIncrement || e.Type == ScrollEventType.LargeIncrement)
            {
                //仅在向下滚动时加载数据
                if (e.NewValue >= dataGridView1.Rows.Count - GetDisplayedRowsCount())
                {
                    //防止因自动滚动而引发
                    TimeSpan ts = DateTime.Now - lastLoading;
                    if (ts.TotalMilliseconds > 100)
                    {
                        firstVisibleRow = e.NewValue;
                        LoadRows();
                    }
                    else
                    {
                        dataGridView1.FirstDisplayedScrollingRowIndex = e.OldValue;
                    }
                }
            }
        }

        private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
        {
            //给行增加序号
            Rectangle rectangle = new Rectangle(e.RowBounds.Location.X, e.RowBounds.Location.Y,
                dataGridView1.RowHeadersWidth - 4, e.RowBounds.Height);
            TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1).ToString(), dataGridView1.RowHeadersDefaultCellStyle.Font, rectangle,
                dataGridView1.RowHeadersDefaultCellStyle.ForeColor, TextFormatFlags.VerticalCenter | TextFormatFlags.Right);
        }

    }

转载于:https://www.cnblogs.com/jiniu/archive/2013/05/15/DataGridView_Scroll_To_End.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值