Сегодня мы создадим программу, позволяющую записывать, редактировать и удалять XML-данные на языке C# в Visual Studio.
За основу XML-данных мы возьмём слегка видоизмененный код из статьи о считывании XML-файла в программу. А именно будем создавать подобные записи:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?xml version="1.0" standalone="yes"?> <NewDataSet> <Employee> <Name>Ivanov Ivan</Name> <Age>24</Age> <Programmer>True</Programmer> </Employee> <Employee> <Name>Petrov Petr</Name> <Age>19</Age> <Programmer>False</Programmer> </Employee> </NewDataSet> |
Внешний вид
Выглядеть наша программа будет вот так:
У на нашей форме находятся следующие элементы: TextBox, NumericUpDown, ComboBox, а также кнопки и элемент DataGridView, разбитый на три столбца и занимающий большую часть формы.
Столбцы настраиваются при нажатии ПКМ на DataGridView и выборе вкладки «Правка столбцов», либо при нажатии на кнопку на этом же элементе. В итоге должно получиться вот так:
В этом окне можно настроить имя, ширину и прочие свойства столбцов. Также стоит ознакомиться с некоторыми изменениями в свойствах данного элемента, которые мы внесли (в исходном файле, который можно скачать внизу статьи). Для удобства использования и избежания некоторых ошибок мы запретили в DataGridView добавлять строки, выбирать более одной строки, а также редактировать данные.
Точно такими же способами, через ПКМ и в ComboBox надо занести два значения «True» и «False» во вкладке «Изменить элементы».
Добавление данных
Далее переходим к коду. Перво-наперво нам надо подключить библиотеку IO:
1 |
using System.IO; |
Данная библиотека отвечает за загрузку, запись и чтение файлов. Она нам понадобится, потом что мы в итоге будем сохранять наш файл на диск.
Теперь идём по кнопкам. Кнопку «Добавить» мы запрограммируем таким образом, что при заполнении наших TextBox’a, NumericUpDown’a и ComboBox’a необходимыми данными и последующем нажатии на данную кнопку, эти записи выводились в DataGridView примерно таким образом:
Для этого в коде кнопки пишем следующее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
private void button1_Click(object sender, EventArgs e) //Добавление данных в форму { if (textBox1.Text == "") { MessageBox.Show("Заполните все поля.", "Ошибка."); } else { int n = dataGridView1.Rows.Add(); dataGridView1.Rows[n].Cells[0].Value = textBox1.Text; // столбец Name dataGridView1.Rows[n].Cells[1].Value = numericUpDown1.Value; // Age dataGridView1.Rows[n].Cells[2].Value = comboBox1.Text; // Programmer } } |
Если TextBox будет пустой, то мы выведем пользователю сообщение, чтобы он заполнил все поля, если же в нём что-либо имеется, тогда мы добавляем строку, в каждый из трёх столбцов которой записываем соответствующие данные.
Сохранение XML-файла
Итак, мы можем добавить сколько угодно записей. Теперь надо их сохранить как один XML-файл.
Поэтому переходим к коду кнопки «Сохранить как XML»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
private void button4_Click(object sender, EventArgs e) //сохранение данных из формы в XML { try { DataSet ds = new DataSet(); // создаем пока что пустой кэш данных DataTable dt = new DataTable(); // создаем пока что пустую таблицу данных dt.TableName = "Employee"; // название таблицы dt.Columns.Add("Name"); // название колонок dt.Columns.Add("Age"); dt.Columns.Add("Programmer"); ds.Tables.Add(dt); //в ds создается таблица, с названием и колонками, созданными выше foreach (DataGridViewRow r in dataGridView1.Rows) // пока в dataGridView1 есть строки { DataRow row = ds.Tables["Employee"].NewRow(); // создаем новую строку в таблице, занесенной в ds row["Name"] = r.Cells[0].Value; //в столбец этой строки заносим данные из первого столбца dataGridView1 row["Age"] = r.Cells[1].Value; // то же самое со вторыми столбцами row["Programmer"] = r.Cells[2].Value; //то же самое с третьими столбцами ds.Tables["Employee"].Rows.Add(row); //добавление всей этой строки в таблицу ds. } ds.WriteXml("G:\\Data.xml"); MessageBox.Show("XML файл успешно сохранен.", "Выполнено."); } catch { MessageBox.Show("Невозможно сохранить XML файл.", "Ошибка."); } } |
По сути мы просто создаем кэш данных под названием ds, затем в этот кэш заносим таблицу со столбцами Name, Age и Programmer.
Затем при помощи оператора цикла foreach, который работает с группами объектов (например, со столбцами и строками таблицы) создаем строку с тремя столбцами, в каждый из которых записываем данные из соответствующих столбцов dataGridView.
В XML-файл данные из ds переводятся автоматически при помощи метода WriteXml.
1 2 3 4 5 6 7 8 |
<?xml version="1.0" standalone="yes"?> <NewDataSet> <Employee> <Name>Smirnov Denis</Name> <Age>21</Age> <Programmer>True</Programmer> </Employee> </NewDataSet> |
Все введенные данные помещаются между тегами <NewDataSet> и </NewDataSet>. В этих тэгах заключены другие: <Employee>…</Employee>. Можно понять, что это — наши строки, которые мы так назвали здесь:
1 |
DataRow row = ds.Tables["Employee"].NewRow(); // создаем новую строку в таблице, занесенной в ds |
Количество таких тегов будет равно количеству строк в DataGridView и, соответственно, количеству строк в ds.
Ну а уже в этих тэгах заключены оставшиеся: <Name>…</Name>, <Age>…</Age>, <Programmer>…</Programmer> — это всё столбцы конкретной строки.
1 2 3 |
row["Name"] = r.Cells[0].Value; //в столбец этой строки заносим данные из первого столбца dataGridView1 row["Age"] = r.Cells[1].Value; // то же самое со вторыми столбцами row["Programmer"] = r.Cells[2].Value; //то же самое с третьими столбцами |
Соответственно, между этими тремя парами тэгов записаны наши данные, введенные в программе — имя, возраст и ответ, является ли данное лицо программистом.
Сохранение данного XML-файла будет произведено по пути, записанному в скобках следующей строки:
1 |
ds.WriteXml("G:\\Data.xml"); |
В данном случае файл сохраняется на диск G и имеет название Data.xml.
Важно: проверьте, имеет ли Visual Studio права для сохранения данных на выбранный вами диск. Если у него не будет для этого прав, то появится ошибка и файл не будет сохранен.
Если всё пройдёт успешно, то появится сообщение о том, что файл сохранен, иначе программа скажет, что файл невозможно сохранить.
Мы научились добавлять и сохранять XML-файл при помощи класса DataSet и элемента DataGridView.
Загрузка XML-файла
Теперь сделаем загрузку XML-данных в нашу программу. Переходим в код соответствующей кнопки «Загрузить XML» и пишем:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
private void button5_Click(object sender, EventArgs e) //загрузка файла XML в форму { if (dataGridView1.Rows.Count > 0) //если в таблице больше нуля строк { MessageBox.Show("Очистите поле перед загрузкой нового файла.", "Ошибка."); } else { if (File.Exists("G:\\Data.xml")) // если существует данный файл { DataSet ds = new DataSet(); // создаем новый пустой кэш данных ds.ReadXml("G:\\Data.xml"); // записываем в него XML-данные из файла foreach (DataRow item in ds.Tables["Employee"].Rows) { int n = dataGridView1.Rows.Add(); // добавляем новую сроку в dataGridView1 dataGridView1.Rows[n].Cells[0].Value = item["Name"]; // заносим в первый столбец созданной строки данные из первого столбца таблицы ds. dataGridView1.Rows[n].Cells[1].Value = item["Age"]; // то же самое со вторым столбцом dataGridView1.Rows[n].Cells[2].Value = item["Programmer"]; // то же самое с третьим столбцом } } else { MessageBox.Show("XML файл не найден.", "Ошибка."); } } } |
Здесь всё с точностью до наоборот. Мы снова создаем пустой кэш данных под названием ds, но в этот раз вносим в него данные из файла Data.xml при помощи метода ReadXml, который автоматически считывает файл именно в формате XML, представляем эти данные в виде таблицы, а затем переносим их в обратном порядке — из таблицы ds в DataGridView.
Также в самом начале кода можно увидеть, что мы запретили загрузку XML-данных, если в DataGridView имеются записи. Можно и не создавать это ограничение, тогда записи из XML-файла будут занесены в DataGridView по порядку после записей, уже там имеющихся. Для исправления же данной «ошибки» мы создали кнопку «Очистить таблицу», код которой будет описан ниже.
Таким образом происходит загрузка XML-файла.
Редактирование данных
Теперь сделаем возможность редактирования данных для XML-файла.
Редактирование мы представим в следующем виде — пользователь выбирает в DataGridView какую-либо строку, а в TextBox’е, NumericUpDown’е и ComboBox’е будут выводиться соответствующие этой строке данные. В этих элементах можно будет менять имя, возраст и причастность к профессии программиста, а после нажатия на кнопку «Редактировать» изменения запишутся в ту же строку DataGridView’а.
Итак, для начала мы переходим в события элемента DataGridView (значок молнии), ищем там MouseClick и щёлкаем на поле рядом с ним два раза:
В появившейся части кода пишем:
1 2 3 4 5 6 7 |
private void dataGridView1_MouseClick(object sender, MouseEventArgs e) // выбор нужной строки для редактирования { textBox1.Text = dataGridView1.SelectedRows[0].Cells[0].Value.ToString(); int n = Convert.ToInt32(dataGridView1.SelectedRows[0].Cells[1].Value); numericUpDown1.Value = n; comboBox1.Text = dataGridView1.SelectedRows[0].Cells[2].Value.ToString(); } |
Смысл данных записей в том, что при выборе той или иной строки DataGridView’a в TextBox заносится первый столбец выбранной строки, в NumericUpDown — второй столбец, а в СomboBox — третий. Таким образом мы выводим все данные, которые можно будет поменять. Теперь переходим к коду кнопки «Редактировать» и пишем в эту часть:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
private void button2_Click(object sender, EventArgs e) //редактирование { if (dataGridView1.SelectedRows.Count > 0) { int n = dataGridView1.SelectedRows[0].Index; dataGridView1.Rows[n].Cells[0].Value = textBox1.Text; dataGridView1.Rows[n].Cells[1].Value = numericUpDown1.Value; dataGridView1.Rows[n].Cells[2].Value = comboBox1.Text; } else { MessageBox.Show("Выберите строку для редактирования.", "Ошибка."); } } |
Если в DataGridView выбрано больше одной строки (в конструкторе формы мы изменили свойство, позволяющее пользователю выбирать больше, чем одну строку, так что, фактически, можно было написать в условии и dataGridView1.SelectedRows.Count =1, но это не столь важно), то мы переписываем в первый столбец выбранной в DataGridView’е строки данные из TextBox’a, во второй столбец — данные из NumericUpDown’a, в третий столбец — данные из ComboBox’a.
Если же строка не выбрана, то всплывет ошибка.
Удаление данных
При выборе строки и нажатии на кнопке «Удалить», данная строка сотрется из DataGridView’a. Для этого надо написать небольшой код к данной кнопке:
1 2 3 4 5 6 7 8 9 10 11 |
private void button3_Click(object sender, EventArgs e) //удалить выбранную строку { if(dataGridView1.SelectedRows.Count > 0) { dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index); //удаление } else { MessageBox.Show("Выберите строку для удаления.", "Ошибка."); } } |
Очистка таблицы
Для загрузки XML-данных из файла нам необходимо сначала очистить DataGridView, как описано в разделе «Загрузка XML-файла». Код кнопки «Очистить таблицу» представлен ниже:
1 2 3 4 5 6 7 8 9 10 11 |
private void button6_Click(object sender, EventArgs e) //очистить таблицу { if (dataGridView1.Rows.Count > 0) { dataGridView1.Rows.Clear(); } else { MessageBox.Show("Таблица пустая.", "Ошибка."); } } |
Итак, мы создали программу, позволяющую добавлять, редактировать и удалять данные, а также сохранять их как XML-файл, а также загружать его.
Полностью рабочая программа представлена ниже:
Скачать исходник
Удачного изучения программирования!
Поделиться в соц. сетях:
Не работает клавиша Загрузить Xml потому что неправильно прописан путь к xml файлу, сохраняет он вот так «ds.WriteXml(«D:\\ds\\Data.xml»);» а загружает так ds.ReadXml(«G:\\Data.xml»); нужно эту строчку поменять на ds.ReadXml(«D:\\ds\\Data.xml»);
А для какой версии вижуал студии или C# написан код программы? Чем открывать код ?
Программа написана в Visual Studio 2013. Открыть можно в данной версии или более поздней.
Можно ли реализовать тоже самое, только нажимая на кнопку добавить/редактировать открывалось новое окно где мы в textbox будем вводить информацию и по нажатию на кнопку «добавить» новая информация записывалась в файл и появлялась в dataGridView.
Заранее большое спасибо )
как понимать эту часть кода: row[«Name»]
? Почему здесь обращаются как будто к массиву, но вместо индекса массива — название? Пожалуйста, скажите, как это называется и что прочитать, чтобы понять
С помощью выражения row[«Name»] идет обращение к полю Name структуры объекта XML.