web-dev-qa-db-fra.com

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

Tout d’abord, j’ai examiné cette question connexe dans ici mais la solution dataGridView1.Rows.Add() ne fonctionne pas dans mon cas.

Dans mon Datagridview, j'ai 3 TextBoxes pour l'entrée de données et 2 ComboBoxes pour que l'utilisateur choisisse les valeurs (qui sont liées à la base de données). L'un de mes TextBox est configuré en lecture seule pour que les utilisateurs ne puissent le renseigner qu'en dehors de la grille de données (avec une TexBox normale et un Button).

Lorsque les utilisateurs remplissent un DataGridView avec des données, il y a toujours une ligne vide en bas; donc je le désactive et j'ai utilisé ce code pour empêcher les utilisateurs d'ajouter une nouvelle ligne dans la grille de données ... 

dataGridView1.AllowUserToAddRows = false

Je veux seulement ajouter une nouvelle ligne lorsque les utilisateurs cliquent sur le bouton que j'ai mentionné ci-dessus (ce qui génère une erreur). 

Le message d'erreur que j'ai reçu était:

"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"

sample image Celui avec une flèche rouge est un ComboBox, et celui avec une flèche verte est un TextBox en lecture seule.

Il semble que vous utilisiez la propriété DataSource de DataGridView. Lorsque cette propriété est utilisée pour lier des données, vous ne pouvez pas explicitement ajouter directement des lignes à DataGridView. Vous devez plutôt ajouter des lignes directement à votre source de données. 

Par exemple, si votre source de données est un DataTable, utilisez le DataTable affecté à la propriété DataSource (non testé):

private void AddARow(DataTable table)
{
    // Use the NewRow method to create a DataRow with 
    // the table's schema.
    DataRow newRow = table.NewRow();

    // Add the row to the rows collection.
    table.Rows.Add(newRow);
}
21
Kerry H

Vous pouvez obtenir le DataGridView 's DataSource et le lancer comme un DataTable.

Ajoutez ensuite une nouvelle DataRow et définissez les valeurs des champs.

Ajoutez la nouvelle ligne à la DataTable et 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();
11
luchezco

Après avoir ajouté une nouvelle ligne, vous devez définir l’index de la ligne dans la limite du nombre de lignes . Vous devez suivre ces étapes.

  1. Tout d'abord, ajoutez une ligne dans DataGridView:

    dataGridView1.Rows.Add();
    
  2. Deuxièmement, définissez le nouvel index de lignes pour compter - 1:

    int RowIndex = dataGridView1.RowCount - 1;
    
  3. Enfin, définissez les valeurs de contrôle qu'il contient:

    DataGridViewRow R = dataGridView1.Rows[RowIndex];
    R.Cells["YourName"].Value = tbName.Text;
    

Et si la source de votre grille de données est datattable, vous devez ajouter une ligne dans cette table. Donnez de nouvelles valeurs à la nouvelle ligne ajoutée dans la table de données et, enfin, reliez à nouveau la grille de données avec la variable datatable.

    DataRow row = dt.NewRow();  
    row["columnname"] = tbName.Text.toString();  
    dt.Rows.Add(row);
    dt.AcceptChanges();  

   dataGridView1.DataSource = dt;  
   dataGridView1.DataBind();

Vérifiez si vous avez correctement défini l’index de la nouvelle ligne. Peut-être que c'est pourquoi vous obtenez cette erreur.

1
Syeda

Le paramètre Bound Datagridview pose un problème qui l'empêche de l'ajouter directement lorsque vous souhaitez ajouter vos données par programme. Ainsi, la meilleure façon indirecte d’ajouter des données est la suivante: et souvenez-vous de ne jamais ajouter de données directement à datagridview par programmation, car cela crée toujours un problème, ajoutez plutôt des données à votre source de données :-)

code for VB.NET
Dim r As DataRow ( C# : Datarow r=new Datarow() below codes apply to C# also)
r = dataset.Tables(0).NewRow
r.Item("field1") = "2"
r.Item("field2") = "somevalue"
dataset.Tables(0).Rows.Add(r)

dataset.Tables(0).acceptchanges()

the update will goes as you do ever
0
Prakash Chandra

La meilleure solution que j'ai trouvée:

//create datatable and columns
DataTable dtable = new DataTable();
dtable.Columns.Add(new DataColumn("Column 1"));
dtable.Columns.Add(new DataColumn("Column 2"));

//simple way create object for rowvalues here i have given only 2 add as per your requirement
object[] RowValues = { "", "" };

//assign values into row object
RowValues[0] = "your value 1";
RowValues[1] = "your value 2";

//create new data row
DataRow dRow;
dRow = dtable.Rows.Add(RowValues);
dtable.AcceptChanges();

//now bind datatable to gridview... 
gridview.datasource=dtable;
gridview.databind();

Source: http://www.codeproject.com/Questions/615379/Adding-rows-to-datagridview-with-existing-columns

0
Ljupco Sofijanov