我正在尝试实现datagridview的虚拟模式,但是当我将RowCount设置为某个数字(以显示滚动条)时,网格希望一次显示所有行,而不仅仅是显示的行。
DataGridView grid = new ...;
grid.VirtualMode = true;
grid.CellValueNeeded += OnCellValueNeeded;
grid.RowCount = dataprovider.GetFullCount();我如何告诉网格只请求显示的行?
发布于 2012-01-23 23:32:17
不幸的是,这似乎是标准行为。我可以通过以下两种方式解决
void OnCellValueNeeded(...)
{
if(!_active) return;
}
grid.VirtualMode = true;
grid.CellValueNeeded += OnCellValueNeeded;
_active = false;
grid.RowCount = dataprovider.GetFullCount();
_active = true;或者在后台线程中使用复杂的延迟抓取来实现IBindingList、ITypedList
更新:这个问题现在似乎已经解决了。我不能再使用以下命令重现它:
static class Program
{
private static Form form;
private static int i;
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var grid = new DataGridView
{
Dock = DockStyle.Fill,
VirtualMode = true,
AllowUserToAddRows = false,
Columns =
{
new DataGridViewTextBoxColumn { HeaderText = "foo" },
new DataGridViewTextBoxColumn { HeaderText = "bar" },
},
};
grid.CellValueNeeded += OnCellValueNeeded;
form = new Form
{
Controls = { grid }
};
//grid.RowCount = 0;
grid.RowCount = 10000;
Application.Run(form);
}
private static void OnCellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
i++;
form.Text = i.ToString();
e.Value = "fooValue";
}
}发布于 2011-12-07 02:18:01
这只是一个猜测,但是您是否已将AutoSizeRowsMode或AutoSizeColumnsMode值设置为AllCells,或者是否有任何列设置为该值?尝试将调整大小模式设置为None或仅设置为DisplayedCells,看看是否仍然有问题。
发布于 2013-06-05 04:35:28
我不确定这是不是和我遇到的问题一样,但是当我经常在VirtualMode DataGridView上大刀阔斧地更改RowCount时,我的性能确实非常差。
我注意到滚动条正在“缓慢”地改变;也就是说,它看起来像是在单独移除我的虚拟行(!)。
无论如何,在每次调用grid.RowCount = n之前执行一次grid.Rows.Clear()将极大地提高性能。
https://stackoverflow.com/questions/8404336
复制相似问题