Jak programowo dodać nowy wiersz do datagridview

157

jeśli dodajesz wiersz do DataTable

DataRow row = datatable1.NewRow();
row["column2"]="column2";
row["column6"]="column6";
datatable1.Rows.Add(row);

Co powiesz na to DataGridView?

LK Yeung
źródło
2
Możesz dodać dane datatable do datagridview po prostu ustawiając źródło danych gridview równe datatabledatagridview1.DataSource = yourDataTable
Jonathan Van Dam

Odpowiedzi:

248

Możesz to zrobić:

DataGridViewRow row = (DataGridViewRow)yourDataGridView.Rows[0].Clone();
row.Cells[0].Value = "XYZ";
row.Cells[1].Value = 50.2;
yourDataGridView.Rows.Add(row);

lub:

DataGridViewRow row = (DataGridViewRow)yourDataGridView.Rows[0].Clone();
row.Cells["Column2"].Value = "XYZ";
row.Cells["Column6"].Value = 50.2;
yourDataGridView.Rows.Add(row);

Inny sposób:

this.dataGridView1.Rows.Add("five", "six", "seven","eight");
this.dataGridView1.Rows.Insert(0, "one", "two", "three", "four");

Od: http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.rows.aspx

Habib
źródło
28
dziękuję, jeśli mój datagridview nie ma wierszy, jak mogę dodać wiersz?
LK Yeung
3
@DavidYeung cóż, w takim razie odpowiedź od MGA może ci pomóc, jakie jest twoje źródło danych? czy jest to datatable? jeśli tak, możesz dodać wiersz do danych, a następnie odświeżyć źródło danych
Habib,
7
Nie możesz bezpośrednio odwoływać się do kolumny według nazwy, tak jak to zrobiłeś: row.Cells ["Kolumna2"]. Wartość = "XYZ"; ... Najpierw musisz sprawdzić indeks: row.Cells [yourDataGridView.Columns ["Kolumna2"]. Indeks] .Value = "XYZ";
Tizz
2
Najlepiej, należy skopiować RowTemplatez DataGridView. Staje się to większym problemem, gdy masz różne style w różnych wierszach w DataGridView.
Anthony,
7
Po przeczytaniu około 20 rozwiązań (znalezionych przez Google) jest to pierwsze, które rozumiem.
C4d
49

Lubię to:

var index = dgv.Rows.Add();
dgv.Rows[index].Cells["Column1"].Value = "Column1";
dgv.Rows[index].Cells["Column2"].Value = 5.6;
//....
Jizakh
źródło
Dzięki, działa to naprawdę dobrze, jeśli masz prostą pojedynczą kolumnę DataGridView dla prostych edytowalnych list tekstu.
Bob Moss,
Działa świetnie w przypadku, gdy nie masz przypisanego źródła danych do widoku siatki
Jhabar
Nie można programowo dodawać wierszy do kolekcji wierszy DataGridView, gdy formant jest powiązany z danymi.
Darth Sucuk
39

Powiedzmy, że masz datagridview, który nie jest powiązany z zestawem danych i chcesz programowo wypełnić nowe wiersze ...

Oto jak to robisz.

// Create a new row first as it will include the columns you've created at design-time.

int rowId = dataGridView1.Rows.Add();

// Grab the new row!
DataGridViewRow row = dataGridView1.Rows[rowId];

// Add the data
row.Cells["Column1"].Value = "Value1";
row.Cells["Column2"].Value = "Value2";

// And that's it! Quick and painless... :o)
Overdrive77
źródło
3
+1: To jedyne rozwiązanie, które faktycznie używa nazw kolumn zdefiniowanych przez datagridview.Columns.Add("columnname"), nie potrzebuje DataTable i kończy się uśmiechem
Roland
32

Lubię to:

 dataGridView1.Columns[0].Name = "column2";
 dataGridView1.Columns[1].Name = "column6";

 string[] row1 = new string[] { "column2 value", "column6 value" };
 dataGridView1.Rows.Add(row1);

Lub musisz ustawić tam wartości indywidualnie, użyj właściwości .Rows(), na przykład:

 dataGridView1.Rows[1].Cells[0].Value = "cell value";
Mahmoud Gamal
źródło
1
Dziękuję Ci. jeśli datagridview ma 30 kolumn, ale chcę po prostu dodać wartość do column2 i column6, a reszta pozostaje pusta lub null. w jaki sposób mogę to zrobić??
LK Yeung
1
@DavidYeung, Oczywiście można: dataGridView1.Rows[1].Cells[0].Value = "cell value";
Mahmoud Gamal
1
dataGridView.Rows.Add (null, 2, null, null, null, 6);
MrFox
int addedRowIndex = dataGridViewRows.Add (); var addedRow = dataGridViewRows [addedRowIndex]; teraz wszystkie wartości są wypełnione wartością domyślną, wystarczy zmienić komórki, które nie są domyślne: addedRow.Cells [column2.Index] .Value = myValue; (zakładając, że kolumna 2 to DataGridViewColumn)
Harald Coppoolse
24

Dodanie nowego wiersza w DGV bez wierszy za pomocą Add () wywołuje zdarzenie SelectionChanged , zanim będzie można wstawić jakiekolwiek dane (lub powiązać obiekt we właściwości Tag).

Tworzenie wiersza klonowania z RowTemplate jest bezpieczniejsze imho :

//assuming that you created columns (via code or designer) in myDGV
DataGridViewRow row = (DataGridViewRow) myDGV.RowTemplate.Clone();
row.CreateCells(myDGV, "cell1", "cell2", "cell3");

myDGV.Rows.Add(row);
Defkon1
źródło
3
Metoda Clone () zwróciła wiersz, ale bez komórek. row.Cells.Count wynosi 0.
MARKAND Bhatt
5
Markand: Wywołaj DataGridViewRow.CreateCells, aby zainicjować kolekcję Cells.
cichy ton
Nie można programowo dodawać wierszy do kolekcji wierszy DataGridView, gdy formant jest powiązany z danymi.
Darth Sucuk
10

W ten sposób dodaję wiersz, jeśli dgrview jest pusty: (myDataGridView ma dwie kolumny w moim przykładzie)

DataGridViewRow row = new DataGridViewRow();
row.CreateCells(myDataGridView);

row.Cells[0].Value = "some value";
row.Cells[1].Value = "next columns value";

myDataGridView.Rows.Add(row);

Zgodnie z dokumentacją: „CreateCells () czyści istniejące komórki i ustawia ich szablon zgodnie z dostarczonym szablonem DataGridView”.

Snorvarg
źródło
2
Dzięki temu było to dla mnie bardzo przydatne, brakowało mi "row.CreateCells (myDataGridView);"
f4d0
Nie można programowo dodawać wierszy do kolekcji wierszy DataGridView, gdy formant jest powiązany z danymi.
Darth Sucuk
8

Jeśli siatka jest powiązana z DataSet / tabelą, lepiej jest użyć BindingSource, takiego jak

var bindingSource = new BindingSource();
bindingSource.DataSource = dataTable;
grid.DataSource = bindingSource;

//Add data to dataTable and then call

bindingSource.ResetBindings(false)    
Anders
źródło
5

tutaj jest inny sposób, aby to zrobić

 private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        dataGridView1.ColumnCount = 3;

        dataGridView1.Columns[0].Name = "Name";
        dataGridView1.Columns[1].Name = "Age";
        dataGridView1.Columns[2].Name = "City";

        dataGridView1.Rows.Add("kathir", "25", "salem");
        dataGridView1.Rows.Add("vino", "24", "attur");
        dataGridView1.Rows.Add("maruthi", "26", "dharmapuri");
        dataGridView1.Rows.Add("arun", "27", "chennai"); 
    }
RC-AI
źródło
4

Jeśli potrzebujesz manipulować czymkolwiek poza ciągiem wartości komórki, na przykład dodając tag, spróbuj tego:

DataGridViewRow newRow = (DataGridViewRow)mappingDataGridView.RowTemplate.Clone();
newRow.CreateCells(mappingDataGridView);

newRow.Cells[0].Value = mapping.Key;
newRow.Cells[1].Value = ((BusinessObject)mapping.Value).Name;
newRow.Cells[1].Tag = mapping.Value;

mappingDataGridView.Rows.Add(newRow);
cichy ton
źródło
3
yourDGV.Rows.Add(column1,column2...columnx); //add a row to a dataGridview
yourDGV.Rows[rowindex].Cells[Cell/Columnindex].value = yourvalue; //edit the value

możesz również utworzyć nowy wiersz, a następnie dodać go do DataGridView w następujący sposób:

DataGridViewRow row = new DataGridViewRow();
row.Cells[Cell/Columnindex].Value = yourvalue;
yourDGV.Rows.Add(row);
F.joksch
źródło
2

Jeśli wiążesz Listę

List<Student> student = new List<Student>();

dataGridView1.DataSource = student.ToList();
student .Add(new Student());

//Reset the Datasource
dataGridView1.DataSource = null;
dataGridView1.DataSource = student;

Jeśli wiążesz DataTable

DataTable table = new DataTable();

 DataRow newRow = table.NewRow();

// Add the row to the rows collection.
table.Rows.Add(newRow);
Mohammad Salmanian
źródło
1

Przykład kopiowania wiersza z dataGridView i dodania nowego wiersza w tym samym dataGridView:

DataTable Dt = new DataTable();
Dt.Columns.Add("Column1");
Dt.Columns.Add("Column2");

DataRow dr = Dt.NewRow();
DataGridViewRow dgvR = (DataGridViewRow)dataGridView1.CurrentRow;
dr[0] = dgvR.Cells[0].Value; 
dr[1] = dgvR.Cells[1].Value;              

Dt.Rows.Add(dR);
dataGridView1.DataSource = Dt;
Szeryf Hamdy
źródło
1
//Add a list of BBDD
var item = myEntities.getList().ToList();
//Insert a new object of type in a position of the list       
item.Insert(0,(new Model.getList_Result { id = 0, name = "Coca Cola" }));

//List assigned to DataGridView
dgList.DataSource = item; 
Rei Salazar
źródło
Czy możesz wyjaśnić, jak to rozwiązałoby problem?
Phani
1
//header
dataGridView1.RowCount = 50;
dataGridView1.Rows[0].HeaderCell.Value = "Product_ID0";


//add row by cell 
 dataGridView1.Rows[1].Cells[0].Value = "cell value";
Chan
źródło
1

Jeśli już zdefiniowałeś a DataSource, możesz pobrać DataGridView´s DataSourcei rzucić go jako Datatable.

Następnie dodaj nowy DataRowi ustaw wartości pól.

Dodaj nowy wiersz do DataTablei zaakceptuj zmiany.

W C # byłoby to coś takiego ...

DataTable dataTable = (DataTable)dataGridView.DataSource;
DataRow drToAdd = dataTable.NewRow();

drToAdd["Field1"] = "Value1";
drToAdd["Field2"] = "Value2";

dataTable.Rows.Add(drToAdd);
dataTable.AcceptChanges();
luchezco
źródło
0

Rozważ aplikację systemu Windows i za pomocą zdarzenia kliknięcia przycisku umieść w niej ten kod.

dataGridView1.Rows
                .Add(new object[] { textBox1.Text, textBox2.Text, textBox3.Text });
DotNET
źródło
0
string[] splited = t.Split('>');
int index = dgv_customers.Rows.Add(new DataGridViewRow());
dgv_customers.Rows[index].Cells["cust_id"].Value=splited.WhichIsType("id;");

Ale pamiętaj, WhichIsTypejest to metoda rozszerzenia, którą stworzyłem.

dalmierz
źródło
2
Kiedy odpowiadasz na pytanie jakimś kodem, a ten kod wymaga niestandardowej metody rozszerzenia, którą utworzyłeś, a nie dołączyłeś kodu dla metody niestandardowej, nie jest to zbyt przydatna odpowiedź.
Bryan
dzięki za wskazówkę. Jestem smutny z tego powodu. ale ta metoda nie jest ważną metodą
rangeeeer