当我使用鼠标将滚动条移动到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行,每当我立刻将滚动条拉到底部时,我的滚动条就会变得坚固起来。 Down,Up&amp; Down,Up&amp;向下,直到达到总行数。它就像滚动条有生命本身......或者是循环...
你们可以在我的代码中看到什么可以重现这种行为?
答案 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
}