C#在datagridview滚动条到达结尾处加载行

时间:2016-09-04 17:28:18

标签: c# winforms datagridview

当我使用鼠标将滚动条移动到datagridview的底部时,我遇到了仅发生的问题。因此,当我点击此按钮时,问题不会发生

enter image description here

我的目标是在开始时加载200行,然后当用户到达datagridview滚动条的末尾时加载更多200行,依此类推。

private void Home_load(object sender, EventArgs e)
{
   LoadRows();
}

// Detects if the scrollbar is at bottom
private void dataGridViewUsers_Scroll(object sender, ScrollEventArgs e)
{
    if (hasMoreRows == false)
        return;

    // The rows height is always 22
    int totalHeight = this.dataGridViewUsers.Rows.Count * 22;

    if ((totalHeight - this.dataGridViewUsers.Height) < this.dataGridViewUsers.VerticalScrollingOffset)
        LoadRows();
}

private void LoadRows()
{
    DataSet DSet = controllers.Users.LazyLoad(offset);

    if (DSet.Tables[0].Rows.Count <= 0)
    {
        hasMoreRows = false;
        return;
    }

    for (int i = 0; i < DSet.Tables[0].Rows.Count; i++)
    {
        this.dataGridViewUsers.Rows.Add
        (
            DSet.Tables[0].Rows[i]["id"].ToString(),
            DSet.Tables[0].Rows[i]["name"].ToString(),
            DSet.Tables[0].Rows[i]["mobile"].ToString(),
            DSet.Tables[0].Rows[i]["signup_date"].ToString()
        );
    }

    offset += 200;
    this.dataGridViewUsers.Refresh();
}

通常人们会抓住滚动条并将其拉到底部。 enter image description here

如果我在datagridview中执行此操作,则会按预期添加更多行,但会发生奇怪的行为。

我有大约2000行,每当我立刻将滚动条拉到底部时,我的滚动条就会变得坚固起来。 Down,Up&amp; Down,Up&amp;向下,直到达到总行数。它就像滚动条有生命本身......或者是循环...

你们可以在我的代码中看到什么可以重现这种行为?

enter image description here enter image description here enter image description here

2 个答案:

答案 0 :(得分:0)

好吧,如果我第一次正确理解你(在第一次程序运行时)只加载200行不是更多不是吗?!如果那样你应该使用LINQ :),如果你熟悉它,你可以这样写:(我将显示PSEUDOCODE)一些数据对象“。选择(p =&gt; p).Take(200)/ /如果您将编写类似的LINQ请求,您将从数据库中获得前200个数据行。

更多这里的样本你可以看一下

var something = someobject.
                     .Select(a => a.name)
                     .Take(200);

P.S。不幸的是,我不熟悉您对C#LINQ库的了解程度,但无论如何,您可以使用谷歌获取有关LINQ的更多具体信息。

希望这对你没什么帮助。祝你好运。

答案 1 :(得分:0)

我通过处理datagridview的EndScroll控件的ScrollBar事件而不是datagridview的Scroll事件解决了该问题。因此,仅当该人释放滚动条时,系统才会检查它是否在datagridview的底部,并进行适当的处​​理。

关于如何访问datagridview ScrollBar的事件,您可以参考此answer,而不是处理Scroll事件,只需像这样处理EndScroll: / p>

using System.linq;
public MyFormConstructor()
{
    InitializeComponent();
    VScrollBar scrollBar = dgv.Controls.OfType<VScrollBar>().First();
    scrollBar.EndScroll += MyEndScrollEventHandler;
}

private void MyEndScrollEventHandler(object sender, ScrollEventArgs e)
{
   // Handler with e.Type set properly
}