Como adicionar uma nova linha ao datagridview programaticamente

157

se adicionar linha a DataTable

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

Que tal DataGridView??

LK Yeung
fonte
2
Você pode adicionar os dados de uma tabela de dados a um datagridview apenas definir a fonte de dados do gridview igual à tabela de dadosdatagridview1.DataSource = yourDataTable
Jonathan Van Dam

Respostas:

248

Você pode fazer:

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

ou:

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

Outra maneira:

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

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

Habib
fonte
28
obrigado, se meu datagridview não possui linhas, como posso adicionar linhas?
LK Yeung
3
@DavidYeung, nesse caso, a resposta da MGA pode ajudá-lo, qual é a sua fonte de dados? é uma tabela de dados? se assim que você pode adicionar a linha para a tabela de dados e, em seguida, atualizar a fonte de dados
Habib
7
Você não pode fazer referência direta a uma coluna pelo nome, como fez: row.Cells ["Column2"]. Value = "XYZ"; ... Você precisa procurar o índice primeiro: row.Cells [yourDataGridView.Columns ["Column2"]. Index] .Value = "XYZ";
Tizz
2
Idealmente, você deve clonar o RowTemplatedo DataGridView. Isso se torna mais um problema quando você tem estilos diferentes em diferentes linhas no DataGridView.
Anthony
7
Depois de ler cerca de 20 soluções (encontradas pelo google), essa é a primeira que eu entendo.
C4d
49

Como isso:

var index = dgv.Rows.Add();
dgv.Rows[index].Cells["Column1"].Value = "Column1";
dgv.Rows[index].Cells["Column2"].Value = 5.6;
//....
Jizakh
fonte
Obrigado, isso funciona muito bem se você tiver uma coluna simples e simples DataGridView para listas editáveis ​​simples de texto.
perfil completo de Bob Moss
Seus trabalhos grandes no caso quando você não tem nenhuma fonte de dados atribuídos a exibição de grade
Jhabar
Linhas não podem ser adicionadas programaticamente à coleção de linhas do DataGridView quando o controle é vinculado a dados.
Darth Sucuk 02/10/19
39

Digamos que você tenha um DataGridView que não esteja vinculado a um conjunto de dados e deseje preencher programaticamente novas linhas ...

Aqui está como você faz isso.

// 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
fonte
3
+1: Esta é a única solução que realmente usa os nomes das colunas, conforme definido por datagridview.Columns.Add("columnname"), não precisa de uma DataTable e termina com um sorriso.
Roland
32

Como isso:

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

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

Ou você precisa definir lá os valores que usam individualmente a propriedade .Rows(), assim:

 dataGridView1.Rows[1].Cells[0].Value = "cell value";
Mahmoud Gamal
fonte
1
obrigado. se o datagridview tiver 30 colunas, mas eu só quero adicionar o valor a column2 e column6 e o ​​restante será nulo ou vazio. como posso fazer isso??
LK Yeung
1
@DavidYeung, Claro que você pode: dataGridView1.Rows[1].Cells[0].Value = "cell value";
Mahmoud Gamal
1
dataGridView.Rows.Add (nulo, 2, nulo, nulo, nulo, 6);
MrFox
int addedRowIndex = dataGridViewRows.Add (); var addedRow = dataGridViewRows [addedRowIndex]; agora todos os valores são preenchidos com o valor padrão, você só precisa alterar as células que não são padrão: addedRow.Cells [column2.Index] .Value = myValue; (assumindo column2 é um DataGridViewColumn)
Harald Coppoolse
24

A adição de uma nova linha em um DGV sem linhas com Add () gera o evento SelectionChanged antes que você possa inserir qualquer dado (ou vincular um objeto na propriedade Tag).

Criar uma linha de clone a partir do RowTemplate é mais seguro:

//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
fonte
3
O método Clone () retornou uma linha, mas sem células. row.Cells.Count é 0.
MARKAND Bhatt
5
Marca e: chame DataGridViewRow.CreateCells para inicializar sua coleção de células.
tom silencioso
Linhas não podem ser adicionadas programaticamente à coleção de linhas do DataGridView quando o controle é vinculado a dados.
Darth Sucuk 2/10
10

É assim que adiciono uma linha se o dgrview estiver vazio: (myDataGridView possui duas colunas no meu exemplo)

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

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

myDataGridView.Rows.Add(row);

De acordo com a documentação: "CreateCells () limpa as células existentes e define seu modelo de acordo com o modelo DataGridView fornecido".

Snorvarg
fonte
2
Obrigado, isso foi muito útil para mim, estava faltando a "row.CreateCells (myDataGridView);"
F4d0
Linhas não podem ser adicionadas programaticamente à coleção de linhas do DataGridView quando o controle é vinculado a dados.
Darth Sucuk
8

Se a grade estiver vinculada a um DataSet / table, é melhor usar um BindingSource como

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

//Add data to dataTable and then call

bindingSource.ResetBindings(false)    
Anders
fonte
5

aqui está outra maneira de fazer isso

 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
fonte
4

Se você precisar manipular algo além da cadeia de valor da célula, como adicionar uma tag, tente o seguinte:

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);
tom silencioso
fonte
3
yourDGV.Rows.Add(column1,column2...columnx); //add a row to a dataGridview
yourDGV.Rows[rowindex].Cells[Cell/Columnindex].value = yourvalue; //edit the value

você também pode criar uma nova linha e adicioná-la ao DataGridView assim:

DataGridViewRow row = new DataGridViewRow();
row.Cells[Cell/Columnindex].Value = yourvalue;
yourDGV.Rows.Add(row);
F.joksch
fonte
2

Se você está vinculando uma lista

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

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

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

Se você está vinculando DataTable

DataTable table = new DataTable();

 DataRow newRow = table.NewRow();

// Add the row to the rows collection.
table.Rows.Add(newRow);
Mohammad Salmanian
fonte
1

Um exemplo de linha de cópia do dataGridView e adicionou uma nova linha no mesmo 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;
Sherif Hamdy
fonte
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
fonte
Você pode explicar como isso resolveria o problema?
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";
Khan
fonte
1

Se você já definiu a DataSource, você pode obter o DataGridView' DataSourcee lançá-lo como a Datatable.

Em seguida, adicione um novo DataRowe defina os valores dos campos.

Adicione a nova linha ao DataTablee aceite as alterações.

Em C #, seria algo assim ..

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

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

dataTable.Rows.Add(drToAdd);
dataTable.AcceptChanges();
luchezco
fonte
0

Considere um aplicativo do Windows e, usando o evento Click do botão, coloque esse código nele.

dataGridView1.Rows
                .Add(new object[] { textBox1.Text, textBox2.Text, textBox3.Text });
Ponto Net
fonte
0
string[] splited = t.Split('>');
int index = dgv_customers.Rows.Add(new DataGridViewRow());
dgv_customers.Rows[index].Cells["cust_id"].Value=splited.WhichIsType("id;");

Mas esteja ciente, WhichIsTypeé o método de extensão que eu criei.

rangeeeer
fonte
2
Quando você responde a uma pergunta com algum código, e esse código requer um método de extensão personalizado que você criou e não incluiu o código para o método personalizado, não é uma resposta extremamente útil.
Bryan
Obrigado pela dica. eu sinto muito por isso. mas que methode não é uma importante methode
rangeeeer