Как добавить новую строку в 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");

вы можете добавить любое количество элементов в коллекции массива.