C# C加载datagridview滚动条上的行到达结束

C# C加载datagridview滚动条上的行到达结束,c#,winforms,datagridview,C#,Winforms,Datagridview,我面临的问题只有在我使用鼠标将滚动条移动到datagridview底部时才会发生。因此,当我单击此按钮时,问题不会出现: 我的目标是在开始时加载200行,然后当用户到达datagridview滚动条的末尾时加载更多的200行,以此类推 private void Home_load(object sender, EventArgs e) { LoadRows(); } // Detects if the scrollbar is at bottom private void dataGri

我面临的问题只有在我使用鼠标将滚动条移动到datagridview底部时才会发生。因此,当我单击此按钮时,问题不会出现:

我的目标是在开始时加载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();
}
通常情况下,人们会抓住滚动条并将其拉到底部。

如果我在datagridview中这样做,会按预期添加更多行,但会发生奇怪的行为

我大约有2000行,每当我一次将滚动条拉到底部时,我的滚动条就会上下、上下、上下,直到它达到总行数为止。这就像滚动条本身有生命..或者在一个循环中

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


如果我理解正确的话,第一次运行程序时,您希望只加载200行,不是吗?!如果是这样的话,你应该使用LINQ:,如果你熟悉它,你可以这样写:我将向你展示一些数据对象的伪代码。选择p=>p.Take200//如果你要写类似的LINQ请求,你将从数据库中获得前200个数据行

这里有更多的例子,你可以看看

var something = someobject.
                     .Select(a => a.name)
                     .Take(200);
顺便说一句,不幸的是,我不知道你对C LINQ库的了解有多深,但无论如何,你可以使用谷歌来获取更多关于LINQ的具体信息


希望这对你有点帮助,祝你好运

我通过处理datagridview的ScrollBar控件的EndScroll事件而不是datagridview的Scroll事件来解决这个问题。因此,只有当用户释放滚动条时,系统才会检查滚动条是否位于datagridview的底部,并进行适当的处理

关于如何访问datagridview滚动条的事件,您可以参考以下内容,而不是处理滚动事件,只需如下处理EndScroll:

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
}

阿菲克,这通常是通过问题来完成的。我认为,与读取更多记录相比,他更关心滚动条的动作。他在加载数据时遇到问题,我猜他在拉起滚动条并释放它时没有正确调用数据。。。。scollbar正在升温并继续加载数据行,这就是我建议使用LINQ的原因。。。。。。。。。。我猜他使用的是老式的数据访问层,如果他愿意的话。。。。。。这意味着他应该更具体地在for循环中如何管理加载过程。我认为他应该使用LINQ,因为它更方便、更安全。我还担心WinForm为什么在我们有WPF的时候使用WinForms