Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по C#_Часть1.doc
Скачиваний:
90
Добавлен:
19.08.2019
Размер:
2.54 Mб
Скачать
      1. Получение определенных версий объекта DataRow

При внесении изменений в строки данных набор данных сохраняет исходные (Original) и новые (Current) версии строк в коллекции DataRowVersion.

Разные версии строки существуют только после ее изменения и до вызова метода AcceptChanges для этой строки. После вызова метода AcceptChanges текущая и исходная версии становятся идентичными.

Для получения исходной версии записи DataRow пропишите код, идентичный следующему:

тип переменная;

переменная = БД.Таблица[№ строки]

["поле", DataRowVersion.Original]

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

string originalFIO;

originalFIO = sotrudnicDataSet1.person[0]

["fio", DataRowVersion.Original].ToString();

Для получения текущей версии записи необходимо получить доступ к значению столбца и добавить параметр к индексу, обозначающему, какую версию строки нужно возвратить:

тип переменная;

переменная = БД.Таблица[№ строки]

["поле", DataRowVersion. Current] .ToString();

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

В следующем примере показано, как можно использовать значение DataRowVersion для получения текущего значения поля fio в DataRow:

string originalFIO;

originalFIO = sotrudnicDataSet1.person[0]

["fio", DataRowVersion.Current].ToString();

      1. Редактирование строк в объекте DataTable

Чтобы обновить существующие записи в наборе данных (индекс строки неизвестен):

  1. Создайте функцию обработки события редактирования данных (кнопка, меню или д.р.).

  2. С помощью метода FindBy присвойте определенной переменной значение найденного DataRow и затем используйте эту переменную для доступа к столбцам, которые требуется изменить и присвоить им новые значения.

Этим действиям соответствует следующий код:

// Вызов метода NewRow для таблицы, в которую необходимо добавить данные, чтобы создать новую пустую строку.

DataRow пер = имя_БД.имя_таблицы.NewRow();

//Поиск записи, в которую необходимо внести изменения

имя_БД.имя_таблицы.Find_ключевое_ поле(значение);

// Внесение изменений

row1["имя_поля "] = textBox3.Text;

row1["имя_поля "] = textBox4.Text;

…………………

//Сохранение данных в таблице

this.Validate();

this.ТаблицаBindingSource.EndEdit();

this.tableAdapterManager.UpdateAll(this.БД);

Примечания.

  • Если ключ составной, а поиск идет по одному полю, то в качестве поисковой функции используется:

имя_БД.имя_таблицы.Select("поле=значение");

  • Если ключ составной и поиск ведется по всем полям ключа, то в поисковой функции FindBy прописываются несколько значений через запятую

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

Пример. Необходимо, чтобы в режиме редактирования при переходе с записи на запись в таблице текущая запись появлялась в панели редактирования:

Для этого действия в обработчики щелчка мыши по таблице необходимо прописать код:

private void allDataGridView_Click(object sender, EventArgs e)

{

DataGridViewRow dr = allDataGridView.CurrentRow;

textBox2.Text = dr.Cells[1].Value.ToString();

textBox1.Text = dr.Cells[0].Value.ToString();

textBox4.Text = dr.Cells[3].Value.ToString();

textBox3.Text = dr.Cells[2].Value.ToString();

textBox5.Text = dr.Cells[4].Value.ToString();

textBox6.Text = dr.Cells[5].Value.ToString();

}

Для обновления записи без проверки какие именно поля были обновлены можно прописать код:

private void button1_Click(object sender, EventArgs e)

{

SotrudnicDataSet1.personRow rp = sotrudnicDataSet1.person.FindBypasport(Convert.ToInt32(textBox2.Text));

rp["pol"] = textBox4.Text;

rp["fio"] = textBox1.Text;

rp["data"] = Convert.ToDateTime(textBox3.Text);

SotrudnicDataSet1.workerRow rw = sotrudnicDataSet1.worker.FindBypasportwork(Convert.ToInt32(textBox2.Text), allDataGridView.CurrentRow.Cells[4].Value.ToString());

if (rw["work"] != allDataGridView.CurrentRow.Cells[4].Value.ToString()) rw["work"] = textBox5.Text;

rw["salary"] = Convert.ToInt32(textBox6.Text);

if (MessageBox.Show("Была фамилия: " + sotrudnicDataSet1.person[0]

["fio", DataRowVersion.Original].ToString() + " Новая фамилия: " + sotrudnicDataSet1.person[0]

["fio", DataRowVersion.Current].ToString(), "Внимание", MessageBoxButtons.OKCancel) == DialogResult.OK)

{

this.Validate();

this.personBindingSource.EndEdit();

this.workerBindingSource.EndEdit();

this.tableAdapterManager.UpdateAll(this.sotrudnicDataSet1);

allTableAdapter.Fill(this.sotrudnicDataSet1.All);

};

}