C# datagradview滚动条事件如何防止重复执行。

我设计的程序中用dataGridView1_Scroll事件:datagradview绑定了数据,当拖动datagradview滚动条到最末,会将查询到的新数据添加到datagradview中,但是现在遇到一点问题,就是当用鼠标拖动datagradview滚动条到底端时,程序会反复执行dataGridView1_Scroll事件,造成程序卡死。我用过这些方法:比如1、在事件中将滚动条位置设置为不在底端(没效果)。2、用bool类型判断,效果不好。3、将dataGridView1_Scroll事件-=,但是不太会用,没办法复位。各位高人有什么办法吗?我贴出代码来:

private void dataGridView1_Scroll(object sender, ScrollEventArgs e)
{
int _ScrollValue = 0;
if (e.ScrollOrientation == ScrollOrientation.VerticalScroll && dataGridView1.FirstDisplayedScrollingRowIndex + dataGridView1.DisplayedRowCount(true) >= dataGridView1.Rows.Count && this.BindSearchData().Rows.Count > 0 && rownum % topNum == 0)//&& MouseButtons == System.Windows.Forms.MouseButtons.Left
{//如果垂直滚动到末端

_ScrollValue = e.NewValue;
if (this.dataGridView1.Tag == null)
{
DataTable dtNew = this.BindSearchData();
if (dtNew == null || dtNew.Rows.Count == 0)
{
this.dataGridView1.Tag = new object();
}
else
{
DataTable dt_ = this.dataGridView1.DataSource as DataTable;
if (dt_ != null)
{

foreach (DataRow drNew in dtNew.Rows)
{

dt_.Rows.Add(drNew.ItemArray);
}
if (dataGridView1.Rows.Count > _ScrollValue)
dataGridView1.FirstDisplayedScrollingRowIndex = _ScrollValue;
//bl = true;
//dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.Rows[0].Index;
}
rownum = dt_.Rows.Count;
this.lblCount.Text = "记录数:" + rownum.ToString() + "条。";
}
// this.dataGridView1.Scroll -= new System.Windows.Forms.ScrollEventHandler(this.dataGridView1_Scroll);
}

}

}

第1个回答  2014-02-12

你只能根据e.NewValue的值来判断,拖到底加载这是最近几年才出来的,winform都多少年了

        private void Form1_Load(object sender, EventArgs e)
        {
            dataGridView1.Columns.Add("a", "a");
            AddPage();
        }
        private void AddPage()
        {
            dataGridView1.Rows.Add();
            dataGridView1.Rows.Add();
            dataGridView1.Rows.Add();
            dataGridView1.Rows.Add();
            dataGridView1.Rows.Add();
            dataGridView1.Rows.Add();
            dataGridView1.Rows.Add();
            dataGridView1.Rows.Add();
            dataGridView1.Rows.Add();
            dataGridView1.Rows.Add();
            dataGridView1.Rows.Add();
            dataGridView1.Rows.Add();
            dataGridView1.Rows.Add();
            dataGridView1.Rows.Add();
            dataGridView1.Rows.Add();
            dataGridView1.Rows.Add();
        }
         
        int start = 1; //这里要根据你的datagridview来设置,加载了一页,将滚动条拖到底,start = e.NewValue
        int pageSize = 15;
        int pageIndex = 0;
        private void dataGridView1_Scroll(object sender, ScrollEventArgs e)
        {
            if (e.ScrollOrientation == ScrollOrientation.VerticalScroll)
            {
                if (e.NewValue >= start + pageSize * pageIndex)
                {
                    AddPage(null, null);
                    pageIndex += 1;
                }
            }
        }

第2个回答  2014-02-13

我写了个简单的例子,实现滚动事件,数据到达最后一条时加载数据。

其中:flag是用来标记是否还有数据的

AddRows方法是用来模拟从数据库获取数据的。

追问

我想做到的效果是,用鼠标拖动滚动条到最底,就加载一次数据,然后滚动条就弹回指定位置。但是你的DEMO和我的都达不到这个效果,C#的滚动条如果用鼠标拖拽到最底,好像会激发它循环执行请求加载数据的次数,用鼠标的滚轮或者用键盘的向下键使滚动条到最底端不会反复执行加载。

本回答被网友采纳