Как добавить новую строку в datagridview?
У меня есть DataGridView, заполненный данными из datasource (SQL). Теперь я хочу добавить новую строку, но я не могу, потому что новые данные не могут быть добавлены в ограниченный DataGridView...
Я пытался :
dataGridView1.Source = null;
dataGridView1.Rows.Add("1");
но она очищает мои предыдущие данные в таблице. Как это сделать, чтобы добавить новую строку без удаления предыдущих данных?
4 ответов
при установке DataSource
свойства to null
, вы, по сути, удалением все данные DataGridView
(поскольку он больше не знает, к чему привязываться).
у вас есть два варианта здесь. Первый-обновление базового источника данных. Предположим, что это DataTable
. В этом случае вы бы сделали что-то вроде:
DataTable dt = dataGridView1.Source as DataTable;
dt.Rows.Add(new object[] { ... });
а то DataGridView
будет забрать на изменения (Примечание что, если вы не привязаны к чему-то, что не реализует INotifyCollectionChanged
интерфейс, вам придется позвонить ResetBindings
метод чтобы обновить сетку).
другой вариант-пусть DataGridView
управление строках. Вы можете сделать это, вручную добавив каждый элемент с помощью Add
метод на DataGridViewRowCollection
возвращено Rows
свойства:
foreach (var item in source)
{
dataGridView1.Rows.Add("1", "2", "3", ...);
}
я бы не сказал, что второе решение -оптимальный, но это сработает.
наконец, предполагая, что вы привязаны к DataTable
(или некоторая другая материализация данных из базового источника данных), это ничего не делает для обновления базового источника данных (это был бы отдельный вопрос).
короткий ответ-нет.
когда вы DataSource
до null, вы разорвали связь между вашим DataGridView
и ваш источник данных, поэтому его данные не будут постоянными. Вы не можете добавить строку в bound DataGridView
потому что он должен представлять состояние базового DataSource
; вы фактически просите .net сделать вашу таблицу не синхронизированной с ее резервным хранилищем, победив цель привязки данных в первую очередь.
если вы хотите добавить строку в в резервном хранилище, вы должны добавить строку DataSource
, а не в DataGridView
.
может быть, вы хотите сделать это вручную и вся? Что-то вроде этого?
DataSet ds = new DataSet();
OleDbDataAdapter adapter = null;
adapter = new OleDbDataAdapter("SELECT * FROM WHERE", conn);
adapter.Fill(ds);
dataGridView1.ColumnCount = 5; //how many columns returns your SQL query? starts with 0
dataGridView1.Columns[0].Name = "COl-1";
dataGridView1.Columns[1].Name = "COl-2";
dataGridView1.Columns[2].Name = "COl-3";
dataGridView1.Columns[3].Name = "COl-4";
dataGridView1.Columns[4].Name = "COl-5";
DataTable dt = ds.Tables[0];
foreach (DataRow dr in dt.Rows)
{
dataGridView1.Rows.Add(
(dr["COL_HEADER_NAME1"].ToString()),
(dr["COL_HEADER_NAME2"].ToString()),
(dr["COL_HEADER_NAME3"].ToString()),
(dr["COL_HEADER_NAME4"].ToString()),
(dr["COL_HEADER_NAME5"].ToString()));
}
вы просто добавляете строки, используя метод add коллекции строк
me.datagridview1.rows.add("first","second","third");
вы можете добавить любое количество элементов в коллекции массива.