Как совместно использовать DataTable между несколькими представлениями Datagrid в приложении и сохранить драгоценную память - PullRequest
1 голос
/ 29 июня 2011

У меня есть список компаний в формате DataTable, который является статичным и доступен для моего приложения.

Различные формы в приложении просто показывают отфильтрованные данные, такие как компании-клиенты, компании-поставщики, прочие и т. Д. В DataGridView.

DataGridViews предназначены только для отображения данных.

Если я запрашиваю DataTable в моих компаниях только для компаний-клиентов и присваиваю результат DatagridView.Datasource, он просто сделает копию и назначитэто DataGridView.

Представьте себе, если у меня есть список из 10 000 клиентов и пользователей, который откроет 10 форм для разных целей, я просто дублирую 10 000 * 10 строк данных.Кроме того, если мой основной DataTable компании будет обновлен, мне также придется обновить все DataGridView.

Поможет ли использование DataViews сэкономить память?Будет ли полезен BindingDatasource?или есть какой-либо лучший способ поделиться DataTable без создания копий в памяти только для отображения цели.

С уважением

1 Ответ

2 голосов
/ 29 июня 2011

Учитывая:

У меня есть список компаний в формате DataTable, который является статическим и доступен для моего приложения

Я предполагаю 1 DataTable.Вам следует использовать RowFilter , см. MSDN: RowFilter :

DataGridView customerView;    
DataGridView supplierView;    // initialize in form

DataTable companiesTable;    // initialized and filled

void SetCustomerCompanyView()
{
    DataView cust = new DataView();

    cust.Table = companiesTable;
    cust.RowFilter = "Type = 'Customer'"; 

    customerView.DataSource = cust;
}

//  repeat for SetSupplierCompanyView()  

Если проблема заключается в том, что один большой DataTable будет скопирован в нескольких активных представлениях,тогда вы должны действительно переосмыслить архитектуру.Если форма скрыта или неактивна, вы всегда можете удалить результаты запроса (в худшем случае) и повторно запросить, если / когда форма снова станет видимой или активной (например, форма с вкладками).Что бы это ни стоило, 10 тыс. Записей легко обрабатываются в большинстве систем и должны поддерживать несколько открытых представлений (отфильтрованных, как указано выше) этого DataTable.

Сравнительно упрощенное сравнение:
Вы можете представить DataView как List<int>, где int будет индексом строки.Когда вы применяете фильтр строк, соответствующие индексы строк добавляются в список.Вы можете легко создать представление с помощью LINQ to DataSets - извлечь нужные вам индексы строк на основе столбца или столбцов данных и добавить их в список.Теперь вы используете этот список для ссылки на только строк (на Table.Rows[RowIndex]), которые вас интересуют из вашего основного DataTable. Как уже говорилось, это гораздо более простая функциональность, чем DataView на самом деле предоставление. Вы не сделали копию DataTable - вы просто создали механизм поверхностной ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...