C# C加载datagridview滚动条上的行到达结束
我面临的问题只有在我使用鼠标将滚动条移动到datagridview底部时才会发生。因此,当我单击此按钮时,问题不会出现: 我的目标是在开始时加载200行,然后当用户到达datagridview滚动条的末尾时加载更多的200行,以此类推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
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