Повышение события для измененного значения ячейки в таблице - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь вызвать событие, если значение ячейки изменилось.
из файла .tps .

Мне удалось подключиться кбаза данных через odbc , которая отлично подходит для базы данных ее возраста, и я также смог использовать запрос SQL, чтобы получить то, что мне нужно.

Вот моя проблема, янадеясь, что сможет вызвать событие, когда ячейка / ячейки определенного столбца изменились.

Я нашел этот для SQL, однако, похоже, что с библиотекой Odbc ничего подобного не происходит.

Итак, один из способов, которым я думал, было иметь два DataSet объекта, и если 1-й объект набора данных имеет значение null, то мы загрузим необходимую таблицу туда и, в конечном итоге, через определенный период,1018 *
если 1-й набор данных не был пустым, то мы установили бы 2-й набор данных равным 1-му, а затем загрузили бы новую таблицу в 1-й набор данных после очистки предыдущей таблицы от нее.

Оттуда мы запустим этот цикл:

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

    /// <summary>
    /// Compare DataSet2 to DataSet1
    /// </summary>
    /// <param name="ds1">DataSet1</param>
    /// <param name="ds2">DataSet2</param>
    /// <param name="tableName">Tables Name</param>
    /// <returns></returns>
    private void CompareTables(string tableName, DataSet ds1, DataSet ds2)
    {
        int index = 0;

        foreach (DataRow dw1 in ds1.Tables[tableName].Rows)
        {
            foreach (DataRow dw2 in ds2.Tables[tableName].Rows)
            {
                if (dw1.ToString() != dw1.ToString())
                {
                    Console.Write(dw1.ToString());
                    Console.WriteLine(index);
                    SomethingHasChanged = true;
                }
                index++;
            }
        }
    }

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

    /// <summary>
    /// Get the Tables Data.
    /// </summary>
    /// <param name="tableName">select your tables name.</param>
    private void DownloadTable(string tableName)
    {
        using (OdbcConnection odbcConnection = new OdbcConnection(ConnectionString))
        {
            string DOWNLOAD_TABLE = "SELECT * FROM " + tableName;
            if (OpenConnectionAsync(odbcConnection).Result)
            {
                if (DataSet1 == null)
                {
                    OdbcCommand odbcCommand = new OdbcCommand(DOWNLOAD_TABLE, odbcConnection);
                    DataTable dataTable = new DataTable();
                    dataTable.Load(odbcCommand.ExecuteReader());

                    DataSet1 = new DataSet();
                    DataSet1.Tables.Add(dataTable);
                }
                else if (DataSet1 != null)
                {
                    // DataSet 2 is now DataSet 1
                    DataSet2 = DataSet1;

                    OdbcCommand odbcCommand = new OdbcCommand(DOWNLOAD_TABLE, odbcConnection);
                    DataTable dataTable = new DataTable();
                    dataTable.Load(odbcCommand.ExecuteReader());

                    DataSet1.Clear();
                    DataSet1.Tables.Add(dataTable);
                }
            }
            Console.WriteLine("Data Downloaded");
        }

Следующая функция - это то, что я создал для запуска вышеуказанных событий.

    private void WaitForChanges()
    {
        if (SomethingHasChanged)
        {
            // do something on change.
        }
        else
        {
            System.Threading.Thread.Sleep(TimeSpan.FromMinutes(5));
            DownloadTable("foo");
        }
    }

И, наконец, вот конструктор и свойства, которые я использую

    private DataSet DataSet1 { get; set; }
    private DataSet DataSet2 { get; set; }
    private Boolean SomethingHasChanged { get; set; }
    private string ConnectionString { get; set; }

    /// <summary>
    /// Create A New DB Manager Object.
    /// </summary>
    /// <param name="connectionString"></param>
    public DBManager(string connectionString = @"Dsn=pChoice_WDC;")
    {
        Task task = Task.Run(() =>
        {
            if (IsValidConnection(connectionString))
            {
                ConnectionString = connectionString;
            }
            else
            {
                throw new Exception("Connection String Error");
            }
        });

        Task.WaitAny(task);
        WaitForChanges();
    }
...