滚动PAST DataGridView的底行

时间:2010-11-04 18:30:31

标签: .net winforms datagridview scroll

是否有一些属性或方法可以设置DataGridView 过去的最后一行的垂直滚动位置?

我的意思是,我说DataGridView有足够的行来填充其客户区。然后(默认情况下,至少)我无法向下滚动这一点:

DataGridView scrolled to bottom row

我希望强制控件继续滚动,这样我就可以在底行下方显示一些灰色区域。我所追求的假设是这样的:

DataGridView scrolled beyond bottom row

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

据我所知,除了推出自己的自定义命令以显示数据之外,没有办法做到这一点。

答案 1 :(得分:1)

如何使用所需大小的Panel和内置大DataGridView,并使用自己的ScrollBar移动内部内容?

DataGridView可以通过以下公式调整大小:

dataGridView1.Height =
    // Total height of all rows
    dataGridView1.Rows.GetRowsHeight(DataGridViewElementStates.None) +
    // Panel visible height
    panel1.ClientSize.Height;

完整示例:

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 WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            dataGridView1.Columns.Add("Test1", "Test1");
            dataGridView1.Columns.Add("Test2", "Test2");

            dataGridView1.Rows.Add("abc", "10");
            dataGridView1.Rows.Add("def", "20");
            dataGridView1.Rows.Add("ghi", "30");
            dataGridView1.Rows.Add("jkl", "40");
            dataGridView1.Rows.Add("mno", "50");
            dataGridView1.Rows.Add("pqr", "60");
            dataGridView1.Rows.Add("stu", "70");
            dataGridView1.Rows.Add("vwx", "80");
            dataGridView1.Rows.Add("yza", "90");

            UpdatePanel();
        }

        void UpdatePanel()
        {
            dataGridView1.Height = dataGridView1.Rows.GetRowsHeight(DataGridViewElementStates.None) + panel1.ClientSize.Height;
            vScrollBar1.Minimum = 0;
            vScrollBar1.Maximum = dataGridView1.Height - panel1.ClientSize.Height;
        }

        private void panel1_Resize(object sender, EventArgs e)
        {
            UpdatePanel();
        }

        private void vScrollBar1_Scroll(object sender, ScrollEventArgs e)
        {
            dataGridView1.Top = -vScrollBar1.Value;
        }
    }
}

Example form

替代且更简单的方法:将面板属性AutoScroll设置为true,但该解决方案有一些滚动错误(重置焦点时重置位置)。可能是那个bug有一些解决方法。