Comment ajouter une nouvelle ligne à datagridview par programmation

157

si ajouter une ligne à DataTable

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

Que diriez-vous DataGridView??

LK Yeung
la source
2
Vous pouvez ajouter les données d'un datatable à un datagridview simplement en définissant la source de données du gridview égale à la datatabledatagridview1.DataSource = yourDataTable
Jonathan Van Dam

Réponses:

249

Tu peux faire:

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

Autrement:

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
la source
28
merci, si mon datagridview n'a pas de lignes, comment puis-je ajouter une ligne?
LK Yeung
3
@DavidYeung bien dans ce cas, la réponse de MGA peut vous aider, quelle est votre source de données? est-ce un datatable? si tel est le cas, vous pouvez ajouter la ligne à la table de données, puis actualiser la source de données
Habib
7
Vous ne pouvez pas référencer directement une colonne par son nom comme vous l'avez fait: row.Cells ["Column2"]. Value = "XYZ"; ... Vous devez d'abord rechercher l'index: row.Cells [yourDataGridView.Columns ["Column2"]. Index] .Value = "XYZ";
Tizz
2
Idéalement, vous devriez cloner RowTemplatele DataGridView. Cela devient plus un problème lorsque vous avez différents styles sur différentes lignes dans le DataGridView.
Anthony du
7
Après avoir lu environ 20 solutions (trouvées par google), c'est la première que je comprends.
C4d
50

Comme ça:

var index = dgv.Rows.Add();
dgv.Rows[index].Cells["Column1"].Value = "Column1";
dgv.Rows[index].Cells["Column2"].Value = 5.6;
//....
Jizakh
la source
Merci, cela fonctionne très bien si vous avez un DataGridView à une seule colonne pour de simples listes de texte modifiables.
Bob Moss
Cela fonctionne très bien dans le cas où vous n'avez pas de source de données affectée à la vue grille
Jhabar
Les lignes ne peuvent pas être ajoutées par programme à la collection de lignes de DataGridView lorsque le contrôle est lié aux données.
Darth Sucuk
39

Disons que vous avez une vue de données qui n'est pas liée à un ensemble de données et que vous souhaitez remplir de nouvelles lignes par programmation ...

Voici comment procéder.

// 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
la source
3
+1: C'est la seule solution qui utilise réellement les noms de colonnes tels que définis par datagridview.Columns.Add("columnname"), n'a pas besoin de DataTable et se termine par un sourire
Roland
32

Comme ça:

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

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

Ou vous devez définir les valeurs individuellement, utilisez la propriété .Rows(), comme ceci:

 dataGridView1.Rows[1].Cells[0].Value = "cell value";
Mahmoud Gamal
la source
1
Merci. si le datagridview a 30 colonnes, mais je veux juste ajouter la valeur à column2 et column6 et le reste reste nul ou vide. Comment puis-je faire ceci??
LK Yeung
1
@DavidYeung, Bien sûr , vous pouvez: 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]; maintenant toutes les valeurs sont remplies avec la valeur par défaut, il vous suffit de changer les cellules qui ne sont pas par défaut: addedRow.Cells [column2.Index] .Value = myValue; (en supposant que column2 est un DataGridViewColumn)
Harald Coppoolse
24

L'ajout d'une nouvelle ligne dans un DGV sans lignes avec Add () déclenche l' événement SelectionChanged avant de pouvoir insérer des données (ou lier un objet dans la propriété Tag).

Créer une ligne de clone à partir de RowTemplate est plus sûr à mon humble avis:

//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
la source
3
La méthode Clone () a renvoyé une ligne mais sans Cells. row.Cells.Count is 0.
MARKAND Bhatt
5
Markand: appelez DataGridViewRow.CreateCells pour initialiser votre collection Cells.
ton silencieux le
Les lignes ne peuvent pas être ajoutées par programme à la collection de lignes de DataGridView lorsque le contrôle est lié aux données.
Darth Sucuk
10

Voici comment j'ajoute une ligne si le dgrview est vide: (myDataGridView a deux colonnes dans mon exemple)

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

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

myDataGridView.Rows.Add(row);

Selon la documentation: «CreateCells () efface les cellules existantes et définit leur modèle en fonction du modèle DataGridView fourni».

Snorvarg
la source
2
Merci, cela a été très utile pour moi, il me manquait le "row.CreateCells (myDataGridView);"
f4d0
Les lignes ne peuvent pas être ajoutées par programme à la collection de lignes de DataGridView lorsque le contrôle est lié aux données.
Darth Sucuk
8

Si la grille est liée à un DataSet / table, il est préférable d'utiliser un BindingSource comme

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

//Add data to dataTable and then call

bindingSource.ResetBindings(false)    
Anders
la source
5

voici une autre façon de faire

 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
la source
4

Si vous avez besoin de manipuler autre chose que la chaîne de valeur de cellule, comme l'ajout d'une balise, essayez ceci:

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

vous pouvez également créer une nouvelle ligne, puis l'ajouter au DataGridView comme ceci:

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

Si vous liez une liste

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

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

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

Si vous liez DataTable

DataTable table = new DataTable();

 DataRow newRow = table.NewRow();

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

Un exemple de copie de ligne de dataGridView et ajout d'une nouvelle ligne dans le même 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
la source
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
la source
Pouvez-vous expliquer comment cela résoudrait le problème?
Phani le
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
la source
1

Si vous avez déjà défini a DataSource, vous pouvez obtenir les DataGridView´s DataSourceet les convertir en a Datatable.

Ajoutez ensuite un nouveau DataRowet définissez les valeurs des champs.

Ajoutez la nouvelle ligne à DataTableet acceptez les modifications.

En C #, ce serait quelque chose comme ça.

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

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

dataTable.Rows.Add(drToAdd);
dataTable.AcceptChanges();
Luchezco
la source
0

Considérez une application Windows et en utilisant l'événement de clic de bouton, mettez ce code dedans.

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

Mais sachez que WhichIsTypec'est la méthode d'extension que j'ai créée.

télémètre
la source
2
Lorsque vous répondez à une question avec du code et que ce code nécessite une méthode d'extension personnalisée que vous avez créée et que vous n'avez pas inclus le code de la méthode personnalisée, ce n'est pas une réponse très utile.
Bryan
Merci pour le conseil. je suis sory à cause de cela. mais cette méthode n'est pas une méthode importante
rangeeeer