2008-09-29 13 views
7

Mam DataGridView z kilkoma utworzonymi kolumnami. Dodałem kilka wierszy i wyświetlają się poprawnie; jednak po kliknięciu komórki zawartość znika.Dodawanie wierszy do datagridview z istniejącymi kolumnami

Co robię źle?

Kod jest w następujący sposób:

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; 
} 

Dzięki!

+0

Mam post na tutaj usunięty, był w stosunku do asp.net, ponieważ nie robię żadnego programowania WinForms i pomyliłem to jako asp.net. Przepraszam za to na wypadek, gdybyś go przeczytał i trochę ci to zmylił. – mattlant

+0

Ok dzięki, w każdym razie nie widziałem. – Nacho

Odpowiedz

3

Edytuj: oops! popełnił błąd w drugiej linii kodu. - naprawione.

Czasami nienawidzę definiować właściwości źródła danych.

Myślę, że za każdym razem, gdy tworzysz i ustawisz nowy wiersz dla "wiersza", z jakiegoś dziwnego powodu, stara wartość zostanie usunięta. nie używaj instancji do przechowywania utworzonych wierszy:

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

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

Wygląda na to, że komórki działają dobrze z instancjami komórki. Nie mam pojęcia, dlaczego jest inaczej w przypadku rzędów. Więcej Próby mogą być wymagane ...

+1

Naprawiło to problem dla mnie. –

4

Wystarczy rozszerzyć na to pytanie, nie ma też inny sposób, aby dodać wiersz do DataGridView, zwłaszcza jeśli kolumny są zawsze takie same:

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()); 

Lub jeśli chcesz 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()); 

wartości w buforze muszą być w tej samej kolejności jak w kolumnach (w tym ukrytych) oczywisto.

Jest to najszybszy sposób, w jaki znalazłem dane do DataGridView bez wiązania siatki z DataSource. Wiązanie siatki przyspieszy ją o znaczną ilość czasu, a jeśli masz więcej niż 500 rzędów w siatce, zdecydowanie zalecam powiązanie go zamiast wypełniania go ręcznie.

Wiązanie wiąże się również z premią, dzięki której można zachować przedmiot w takt, f.e. jeśli chcesz działać na wybranym wierszu, można zrobić to DataGridView jest związany:

if(gridViewParts.CurrentRow != null) 
{ 
    SaleItem item = (SalteItem)(gridViewParts.CurrentRow.DataBoundItem); 
    // You can use item here without problems. 
} 

Zaleca się, że zajęcia, które uzyskać związany nie implementować interfejs System.ComponentModel.INotifyPropertyChanged, która pozwala mu powiedzieć siatkę o zmiany.

Powiązane problemy