Как получить доступ к источнику данных DataGridView с привязкой к данным? - PullRequest
0 голосов
/ 31 марта 2020

Я создаю управляемое данными приложение WinForms в C#, используя базу данных PostgreSQL. В настоящее время я заполняю два моих DataGridView следующим образом.

У меня есть класс, в котором я планирую выполнять всю свою работу, связанную с базой данных - получать данные из базы данных, добавлять обновления и удалять данные в таблицах базы данных, и др c. Этот класс в настоящее время выглядит так:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using Npgsql;

namespace Test_XRef_Tool.Xref_Test
{
    public class Db
    {
        private string connString = String.Format("Server = localhost; Port = 5432; Database = dvdrental; User Id = userid; Password = password;");

        // Used to retrieve data for population of controls (DGVs, CBOs, etc)
        public DataTable GetData(string selectQuery)
        {
            NpgsqlConnection conn = new NpgsqlConnection(connString);
            DataSet ds = new DataSet();

            try
            {
                conn.Open();
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(selectQuery, conn);
                conn.Close();

                da.Fill(ds);
                return ds.Tables[0];
            }
        }

    }
}

И в моем классе Form1 я заполняю два DGV. Код для их заполнения выглядит следующим образом:

Db categoriesData = new Db();
dgvCategories.DataSource = categoriesData.GetData("SELECT * FROM actor");

Db defaultsData = new Db();
dgvDefaults.DataSource = defaultsData.GetData("SELECT * FROM film");

Все это прекрасно работает для заполнения DGV, но я понял, что во время редактирования пользователем DGV и различных других операций, которые я планирую выполнить в программе, Мне нужен доступ к источнику данных DGV - до внесения каких-либо изменений в ячейки DGV.

Как мне это сделать? Я думаю, что мне нужно создать какой-то объект или переменную в классе Form1, который будет хранить текущее состояние данных DGV, но я не могу понять, как это сделать - если это даже правильный способ сделать это .

1 Ответ

0 голосов
/ 31 марта 2020

В соответствии с комментарием jimi, если вы хотите, чтобы набор данных был связан с DGV, он все еще там, в источнике данных DGV:

DataTable dt = dgv.DataSource as DataTable;

Если вы отредактируете значение, хранящееся в объекте данных, этот набор данных запомнит исходное значение. Представьте, что вы загрузили Джона Смита в первый ряд вашей таблицы данных со столбцом с именем «name»:

Console.WriteLine(dt[0]["name"]); //prints John Smith

dt[0]["name"] = "Jane Doe";

Строка теперь имеет две версии:

Console.WriteLine(dt[0]["name", DataRowVersion.Current]); //prints Jane Doe
Console.WriteLine(dt[0]["name", DataRowVersion.Original]); //prints John Smith 

Если вы приняли AcceptChanges на дата (или все данные), оригинал перезаписывается текущим:

dt.AcceptChanges();
Console.WriteLine(dt[0]["name", DataRowVersion.Current]); //prints Jane Doe
Console.WriteLine(dt[0]["name", DataRowVersion.Original]); //prints Jane Doe

пс; вы можете покончить с набором данных в вашем вспомогательном методе

    public DataTable GetData(string selectQuery)
    {
        NpgsqlConnection conn = new NpgsqlConnection(connString);
        DataTable dt = new DataTable();

        try
        {
            conn.Open();
            NpgsqlDataAdapter da = new NpgsqlDataAdapter(selectQuery, conn);
            conn.Close();

            da.Fill(dt);
            return dt;
        }
    }
...