Я использую System.Windows.Forms.DataGrid. Он заполнен примерно 3000 рядами и очень медленно перерисовывается. Если я минимизирую и максимизирую свою форму, все остальные элементы управления просто отображаются, но в конечном итоге я просматриваю перерисовку DataGrid по строкам. Все в этом DataGrid является только для чтения, если это имеет значение.DataGrid slow to Redraw
Update:
Я не совсем уверен, как правильно реализовать событие CellValueNeeded() для моего проекта, или, если это поможет производительность DataGrid в моем случае.
Я создаю элемент управления пользователя, который содержит DataGridView (см. Ниже код). Когда вызывается метод SetProject(), мой элемент управления задается конкретным экземпляром моего класса Project. Затем элемент управления использует статический метод Informa.Data.GetProjectDataTable (Project proj) для извлечения DataTable из проекта. Затем свойство DataSource DataGrid устанавливается на возвращаемый DataTable.
Это первый раз, когда я сделал что-либо с ADO или DataGrids, так что несите меня. Похоже, что CellValueNeed() позволяет мне переопределить, как DataGrid находит значение для одной из его ячеек, но в моем случае это намного сложнее, чем примеры в MSDN. Фактическим источником моих данных является древовидная структура различных объектов Node, корнем которой является экземпляр Project. Каждый узел может иметь переменный набор свойств, который также может быть расширен пользователем во время выполнения. Затем существует множество других сложностей с Nodes, наследующими значения свойств от их родительских узлов, и суммирование других свойств от их дочерних узлов.
Informa.Data.GetProjectDataTable() прорезает все это безумие и генерирует единый плоский DataTable всех свойств всех узлов. На этом этапе мне не нужно связывать изменение таблицы с исходной структурой дерева или обновлять определенные части таблицы при изменении древовидной структуры. Все, что я хочу сделать, это отобразить данные пользователю в DataGrid.
Итак, я реализую CellValueNeeded() для чтения из DataTable, предоставленного Проектом? Я бы подумал, что DataGrid уже знает, как эффективно использовать DataTable в качестве источника данных?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Informa;
namespace Informa
{
public partial class ProjectGridControl : UserControl
{
private Project proj;
public ProjectGridControl()
{
InitializeComponent();
}
public void SetProject(Project proj)
{
this.proj = proj;
UpdateGridControl();
}
public void UpdateGridControl()
{
if (this.proj == null)
{
this.dataGrid.DataSource = null;
}
else
{
//Extracts a DataTable from the project and sets it as the
//DataSource of the property grid
this.dataGrid.DataSource = Informa.Data.GetProjectDataTable(proj);
}
}
}
}
предлагаю вам разместить некоторые (вырезанные) коды ... –
Какие события увольняют? Какие события вы занимаетесь? Если у вас есть код, запущенный для каждого столбца/строки/ячейки, которая привязана, я бы проверил там. –
Я не занимаюсь никакими событиями. Я создаю DataTable и устанавливаю его как DataSource DataGrid. Вот и все. –