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); } }