Добавление строк в сетку данных с существующими столбцами - PullRequest
7 голосов
/ 29 сентября 2008

У меня есть DataGridView с несколькими созданными столбцами. Я добавил несколько строк, и они отображаются правильно; однако, когда я нажимаю на ячейку, содержимое исчезает.

Что я делаю не так?

Код выглядит следующим образом:

foreach (SaleItem item in this.Invoice.SaleItems)
{
    DataGridViewRow row = new DataGridViewRow();
    gridViewParts.Rows.Add(row);

    DataGridViewCell cellQuantity = new DataGridViewTextBoxCell();
    cellQuantity.Value = item.Quantity;
    row.Cells["colQuantity"] = cellQuantity;

    DataGridViewCell cellDescription = new DataGridViewTextBoxCell();
    cellDescription.Value = item.Part.Description;
    row.Cells["colDescription"] = cellDescription;

    DataGridViewCell cellCost = new DataGridViewTextBoxCell();
    cellCost.Value = item.Price;
    row.Cells["colUnitCost1"] = cellCost;

    DataGridViewCell cellTotal = new DataGridViewTextBoxCell();
    cellTotal.Value = item.Quantity * item.Price;
    row.Cells["colTotal"] = cellTotal;

    DataGridViewCell cellPartNumber = new DataGridViewTextBoxCell();
    cellPartNumber.Value = item.Part.Number;
    row.Cells["colPartNumber"] = cellPartNumber;
}

Спасибо!

Ответы [ 2 ]

4 голосов
/ 21 октября 2009

Просто для расширения этого вопроса есть еще один способ добавить строку в 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, который позволяет ему сообщать сетке об изменениях.

3 голосов
/ 20 мая 2009

Редактировать: упс! сделал ошибку во второй строке кода. - исправил.

Иногда я ненавижу определять свойство источника данных.

Я думаю, что всякий раз, когда вы создаете и устанавливаете новую строку для «строки», по какой-то странной причине старое значение удаляется. попробуйте не использовать экземпляр для хранения созданных вами строк:

int i;
i = gridViewParts.Rows.Add( new DataGridViewRow());

DataGridViewCell cellQuantity = new DataGridViewTextBoxCell();
cellQuantity.Value = item.Quantity;
gridViewParts.Rows[i].Cells["colQuantity"] = cellQuantity;

Кажется, что клетки отлично работают с экземплярами клеток. Я понятия не имею, почему это отличается для строк, хотя. Могут потребоваться дополнительные испытания ...

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