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

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

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

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

dataGridView1.AllowUserToAddRows = false

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

Сообщение об ошибке, которое я получил, было:

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

sample image один с красной стрелкой - это ComboBox, а тот, у которого зеленая стрелка, является только текстовым полем TextBox

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

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

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

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

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

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

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

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

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

Ответ 4

У 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

Ответ 5

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

//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/info/615379/Adding-rows-to-datagridview-with-existing-columns