Строки не могут быть программно добавлены в коллекцию строк таблицы данных, когда элемент управления привязан к данным. - PullRequest
15 голосов
/ 03 января 2012

Прежде всего, я посмотрел этот связанный вопрос в здесь , но решение dataGridView1.Rows.Add() не работает в моем случае.

В моем Datagridview у меня есть 3 TextBox для ввода данных и 2 ComboBox для выбора пользователем значений (которые привязаны к базе данных). Один из моих текстовых блоков настроен на чтение только для того, чтобы пользователи могли заполнять его только вне сетки данных (с помощью обычного TexBox и кнопки).

Когда пользователи заполняют DataGridView данными, внизу всегда есть пустая строка; поэтому я отключил это и использовал этот код, чтобы пользователи не могли добавлять новую строку в сетку данных ...

dataGridView1.AllowUserToAddRows = false

Я хочу добавлять новую строку только тогда, когда пользователи нажимают кнопку, о которой я упоминал выше (которая выдает ошибку).

Я получил сообщение об ошибке:

"Строки не могут быть программно добавлены в коллекцию строк таблицы данных, когда элемент управления привязан к данным"

sample image поле с красной стрелкой - это поле со списком, а поле с зеленой стрелкой - только для чтения. TextBox

Ответы [ 5 ]

22 голосов
/ 03 января 2012

Похоже, что вы используете свойство DataSource DataGridView. Когда это свойство используется для привязки к данным, вы не можете явно добавить строки непосредственно в DataGridView. Вместо этого вы должны добавить строки непосредственно к вашему источнику данных.

Например, если вашим источником данных является DataTable, используя DataTable, который назначен свойству DataSource (не проверено):

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);
}
12 голосов
/ 03 февраля 2016

Вы можете получить DataGridView DataSource и разыграть его как DataTable.

Затем добавьте новый DataRow и установите значения полей.

Добавьте новую строку в DataTable и примите изменения.

В C # это будет примерно так:

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

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

dataTable.Rows.Add(drToAdd);
dataTable.AcceptChanges();
0 голосов
/ 10 августа 2015

Лучшее решение, которое я нашел:

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

Источник: http://www.codeproject.com/Questions/615379/Adding-rows-to-datagridview-with-existing-columns

0 голосов
/ 15 июня 2015

Проблема Bound Datagridview заключается в том, что когда вы хотите добавить свои данные программным способом, они мешают добавить их напрямую. поэтому косвенный и лучший способ добавления данных выглядит следующим образом ... и помните, что никогда не добавляйте данные напрямую в datagridview программно, потому что это всегда создает проблему, вместо этого добавьте данные в свой источник данных: -)

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 голосов
/ 03 января 2012

После добавления новой строки вы должны установить индекс строки в границе количества строк.Вы должны сделать эти шаги.

  1. Сначала добавьте строку в DataGridView:

    dataGridView1.Rows.Add();
    
  2. Во-вторых, установите индекс новой строки для подсчета -1:

    int RowIndex = dataGridView1.RowCount - 1;
    
  3. Затем, наконец, установите значения элементов управления в нем:

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

И если источник вашей таблицы данных является датируемымВы должны добавить строку в эту таблицу. Дать новые значения новой добавленной строке в таблице данных и, наконец, заново связать таблицу данных с обновленной таблицей данных.

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

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

Проверьте, установлен ли индекс новой строкидолжным образом.Возможно, именно поэтому вы получаете эту ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...