Просто для расширения этого вопроса есть еще один способ добавить строку в DataGridView
, особенно если столбцы всегда одинаковы:
object[] buffer = new object[5];
List<DataGridViewRow> rows = new List<DataGridViewRow>();
foreach (SaleItem item in this.Invoice.SaleItems)
{
buffer[0] = item.Quantity;
buffer[1] = item.Part.Description;
buffer[2] = item.Price;
buffer[3] = item.Quantity * item.Price;
buffer[4] = item.Part.Number;
rows.Add(new DataGridViewRow());
rows[rows.Count - 1].CreateCells(gridViewParts, buffer);
}
gridViewParts.Rows.AddRange(rows.ToArray());
Или, если вам нравится ParamArrays:
List<DataGridViewRow> rows = new List<DataGridViewRow>();
foreach (SaleItem item in this.Invoice.SaleItems)
{
rows.Add(new DataGridViewRow());
rows[rows.Count - 1].CreateCells(gridViewParts,
item.Quantity,
item.Part.Description,
item.Price,
item.Quantity * item.Price,
item.Part.Number
);
}
gridViewParts.Rows.AddRange(rows.ToArray());
Значения в буфере должны быть в том же порядке, что и столбцы (включая скрытые), очевидно.
Это самый быстрый способ найти данные для DataGridView
без привязки сетки к DataSource
. Привязка сетки на самом деле ускорит ее на значительное время, и если у вас в сетке более 500 строк, я настоятельно рекомендую связать ее вместо заполнения вручную.
Связывание также идет с бонусом, который вы можете держать объект в такте, например. если вы хотите работать с выбранной строкой, вы можете сделать это, если DatagridView привязан:
if(gridViewParts.CurrentRow != null)
{
SaleItem item = (SalteItem)(gridViewParts.CurrentRow.DataBoundItem);
// You can use item here without problems.
}
Рекомендуется, чтобы ваши классы, которые связаны, реализовали интерфейс System.ComponentModel.INotifyPropertyChanged
, который позволяет ему сообщать сетке об изменениях.