Строки не могут быть программно добавлены в коллекцию строк datagridview, когда элемент управления привязан к данным
Прежде всего, я рассмотрел этот связанный вопрос в здесь, но решение dataGridView1.Rows.Add()
не работает в моем случае.
В моем Datagridview у меня есть 3 TextBoxes для ввода данных и 2 ComboBoxes для пользователя, чтобы выбрать значения (которые привязаны к базе данных). Один из моих TextBoxes настроен на чтение только для того, чтобы пользователи могли заполнять его только за пределами datagrid (с помощью обычного TexBox и кнопки).
Когда пользователи заполняют DataGridView данными, всегда есть пустая строка внизу; поэтому я отключил это, и я использовал этот код, чтобы пользователи не добавляли новую строку внутри datagrid...
dataGridView1.AllowUserToAddRows = false
Я хочу только добавить новую строку, когда пользователи нажимают кнопку, указанную выше (которая вызывает ошибку).
Сообщение об ошибке, которое я получил, было:
"Строки не могут быть программно добавлены в коллекцию строк datagridview, когда элемент управления привязан к данным"
один с красной стрелкой - это 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