web-dev-qa-db-ger.com

Zeilen können nicht programmgesteuert zur datagridview-Datensammlung hinzugefügt werden, wenn das Steuerelement datengebunden ist

Zuerst habe ich diese verwandte Frage in hier nachgeschlagen, aber die Lösung dataGridView1.Rows.Add() funktioniert in meinem Fall nicht.

In meinem Datagridview stehen 3 TextBoxen für die Dateneingabe und 2 ComboBoxen zur Auswahl der Werte (die in die Datenbank eingebunden sind) zur Verfügung. Eine meiner TextBoxen ist so eingestellt, dass sie nur gelesen werden kann, sodass die Benutzer sie nur außerhalb des Datenbereichs (mit einer normalen TexBox und einem Button) auffüllen können.

Wenn die Benutzer eine DataGridView mit Daten füllen, befindet sich unten immer eine leere Zeile. Ich deaktiviere dies und habe diesen Code verwendet, um zu verhindern, dass die Benutzer eine neue Zeile innerhalb des Datagrids hinzufügen ... 

dataGridView1.AllowUserToAddRows = false

Ich möchte nur eine neue Zeile hinzufügen, wenn die Benutzer auf die oben erwähnte Schaltfläche klicken (was einen Fehler auslöst). 

Die Fehlermeldung, die ich bekam, war:

"Zeilen können nicht programmgesteuert zur Zeilensammlung von datagridview hinzugefügt werden, wenn das Steuerelement datengebunden ist."

sample imageDie mit einem roten Pfeil ist eine ComboBox und die mit einem grünen Pfeil ist eine schreibgeschützte TextBox

Es scheint, als würden Sie die DataSource-Eigenschaft von DataGridView verwenden. Wenn diese Eigenschaft zum Binden von Daten verwendet wird, können Sie der DataGridView-Zeile keine expliziten Zeilen direkt hinzufügen. Sie müssen stattdessen Zeilen direkt zu Ihrer Datenquelle hinzufügen. 

Wenn Ihre Datenquelle beispielsweise eine DataTable ist, verwenden Sie die DataTable, die der DataSource-Eigenschaft zugewiesen ist (nicht getestet):

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

Sie können die DataGridView der DataSource erhalten und als DataTable umwandeln.

Fügen Sie dann eine neue DataRow hinzu und legen Sie die Werte der Felder fest.

Fügen Sie die neue Zeile zu DataTable hinzu und akzeptieren Sie die Änderungen.

In C # würde es so aussehen:

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

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

dataTable.Rows.Add(drToAdd);
dataTable.AcceptChanges();
11
luchezco

Nachdem Sie eine neue Zeile hinzugefügt haben, müssen Sie den Zeilenindex an der Begrenzung der Zeilenanzahl festlegen. __ Sie müssen diese Schritte ausführen.

  1. Fügen Sie zuerst eine Zeile in DataGridView hinzu:

    dataGridView1.Rows.Add();
    
  2. Zweitens setzen Sie den neuen Zeilenindex auf count - 1

    int RowIndex = dataGridView1.RowCount - 1;
    
  3. Dann legen Sie zuletzt die Steuerwerte fest:

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

Und wenn die Quelle Ihres Datagrids datattabel ist, müssen Sie eine Zeile in dieser Tabelle hinzufügen. Geben Sie der neu hinzugefügten Zeile in der Datentabelle neue Werte und binden Sie das Datagrid zuletzt mit der aktualisierten Datentabelle wieder.

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

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

Prüfen Sie, ob Sie den Index der neuen Zeile richtig festgelegt haben. Vielleicht erhalten Sie deshalb diesen Fehler.

1
Syeda

Beim gebundenen Datagridview besteht das Problem, dass das programmgesteuerte Hinzufügen von Daten das direkte Hinzufügen verhindert. Die indirekte und beste Möglichkeit, Daten hinzuzufügen, ist wie folgt. Denken Sie daran, Daten nicht programmgesteuert direkt in datagridview hinzuzufügen, da dies zu Problemen führt.

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

Die beste Lösung, die ich gefunden habe:

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

Quelle: http://www.codeproject.com/Questions/615379/Adding-rows-to-datagridview-mit-existierenden- Spalten

0