Корректировка записей в базе данных
Перейдем на вкладку UPDATE. Выполним двойной щелчок по кнопке «Изменить». Здесь нужно проверить наличие идентификатора и заполнены ли поля «Имя продукта» и «Цена». Также как и на вкладке UPDATE, добавим Label на вкладку UPDATE.
Выполним проверку, не пусты ли поля в обработчике события кнопки «Изменить»:
if (label8.Visible) label8.Visible = false;
if (!string.IsNullOrEmpty(textBox4.Text) && !string.IsNullOrWhiteSpace(textBox4.Text) &&
!string.IsNullOrEmpty(textBox3.Text) && !string.IsNullOrWhiteSpace(textBox3.Text) &&
!string.IsNullOrEmpty(textBox5.Text) && !string.IsNullOrWhiteSpace(textBox5.Text))
{
}
else
{
label8.Visible = true;
label8.Text = "Заполните все поля!";
}
Напишем команду для обновления данных:
SqlCommand command = new SqlCommand("UPDATE [Products] SET [Name] = @Name, [Price] = @Price WHERE [Id] = @Id", sqlConnection);
Свяжем ее с полями TextBox:
command.Parameters.AddWithValue("Id", textBox5.Text);
command.Parameters.AddWithValue("Name", textBox4.Text);
command.Parameters.AddWithValue("Price", textBox3.Text);
И выполним:
command.ExecuteNonQuery();
Запустим приложение, перейдем на вкладку UPDATE, и изменим данные по идентификатору 3. В поле «Имя» запишем банан, а в поле «Цена» - 30.
Нажмем кнопку «Изменить» и затем обновим вывод на вкладке SELECT:
Видим, что вместо печенья в строку три занесен банан.
Удаление записей из базы данных
Также как и в предыдущих примерах, добавим Label на вкладку DELETE, и присвоим свойству Visible значение false.
Вызовем обработчик события кнопки «Удалить» и пропишем туда проверку заполнения полей:
if (label9.Visible) label8.Visible = false;
if (!string.IsNullOrEmpty(textBox6.Text) && !string.IsNullOrWhiteSpace(textBox6.Text))
{
}
else
{
label9.Visible = true;
label9.Text = "Заполните поле 'Id'!";
}
Теперь напишем новую команду и выполним ее:
SqlCommand command = new SqlCommand("DELETE FROM [Products]" +
" WHERE [Id] = @Id", sqlConnection);
command.Parameters.AddWithValue("Id", textBox6.Text);
command.ExecuteNonQuery();
Запустим программу и удалим запись в таблице продуктов под номером 3:
После нажатия на кнопку «Удалить», обновим список на вкладке SELECT, и увидим, что запись под номером 3 удалена.
Установка ReportViewer
Формирование отчетов в Visual Studio может выполняться разными способами, в том числе и без специализированных элементов управления. Рассмотрим элемент управления ReportViewer. Он используется для размещения детализированных отчетов в проектах приложений Windows.
Начнем с установки ReportViewer в проект. Выберем вкладку «Сервис» в панели управления, и из выпадающего списка «Расширения и обновления».
Откроется окно расширений. В меню слева выберем пункт «В сети». Теперь найдем нужные компоненты через строку поиска, напишем туда «report».
Теперь нужно скачать Microsoft Rdlc Report Designer for Visual Studio. После завершения установки закроем окно и закроем Visual Studio, для того чтобы скачанное расширение установилось. После закрытия студии откроется следующее окно:
Нажимаем «Изменить» и дожидаемся окончания установки.
В обозревателе решений правой кнопкой выберем пункт «Ссылки» и затем «Управление пакетами NuGet». В появившемся окне выберем вкладку «Обзор». В строке поиска введем запрос «reportviewercontrol».
Скачаем версию для .Net Windows Forms.
В панели элементов правой кнопкой выберем «Общие» и затем «Выбрать элементы». Откроется следующее окно:
Для указания пути к установленной библиотеке нажмем «Обзор». Откроется окно для указания пути. В папке проекта откроем папку packages, затем папку «Microsoft.ReportingServices.ReportViewerControl.Winforms.140.1000.523», затем «lib», затем «net40», и выберем файл «Microsoft.ReportViewer.WinForms.dll». Нажмем «Открыть».
Видим, что в панели элементов появился элемент ReportViewer.
Формирование отчетов
Создадим еще одну форму. В обозревателе решений правой кнопкой нажмем на название проекта, выберем «Добавить», и выберем «Создать элемент». Из списка выберем элемент «Форма WindowsForms». Теперь на форму добавим элемент управления ReportViewer и закрепи ее в родительском контейнере.
В обозревателе решений правой кнопкой нажмем на название проекта, выберем пункт «Добавить» и далее «Создать элемент». Из списка выберем мастер отчетов. Откроется мастер отчетов:
В мастере настройки источника данных нажимаем «Далее».
Нажимаем «Далее».
Нажимаем «Далее». Ставим галочку на пункте «Таблицы» и нажимаем «Готово».
Теперь из доступных полей нужно мышкой перетащить поля в область «Значения» и нажать «Далее».
После этого завершаем мастер установки, нажимая «Далее» и «Готово» в конце.
Теперь отчет выглядит так:
Перейдем на форму 2, и элементу ReportViewer в выпадающем меню, в пункте «Choose report» укажем наш созданный отчет.
На вкладку SELECT формы 1 добавим кнопку «Показать отчет», а в ее обработчике события пропишем следующий код:
new Form2().Show();
Выровняем данные в отчете по центру, добавим новое текстовое поле с названием отчета над таблицей, запустим приложение, и нажмем на кнопку «Показать отчет».
Файлы
В начале рассмотрим основные возможности.
В С# есть пространство имен System.IO, в котором реализованы все необходимые нам классы для работы с файлами. Чтобы подключить это пространство имен, необходимо в самом начале программы добавить строку using System.IO. Для использования кодировок еще добавим пространство:
using System.Text;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
Для создания пустого файла, в классе File есть метод Create(). Он принимает один аргумент – путь. Ниже приведен пример создания пустого текстового файла new_file.txt на диске D:
static void Main(string[] args)
{ File.Create("D:\\new_file.txt");}
Если файл с таким именем уже существует, он будет переписан на новый пустой файл.
Метод WriteAllText() создает новый файл (если такого нет), либо открывает существующий и записывает текст, заменяя всё, что было в файле:
static void Main(string[] args)
{ File. WriteAllText("D:\\new_file.txt", "текст");}
Метод AppendAllText() работает, как и метод WriteAllText() за исключением того, что новый текст дописывается в конец файла, а не переписывает всё что было в файле:
static void Main(string[] args)
{ File.AppendAllText("D:\\new_file.txt", "текст метода AppendAllText ()"); //допишет текст в конец файла
}
Метод Delete() удаляет файл по указаному пути:
static void Main(string[] args)
{ File.Delete("d:\\test.txt"); //удаление файла }
Кроме того, чтобы читать/записывать данные в файл с С# можно использовать потоки.
Поток – это абстрактное представление данных (в байтах), которое облегчает работу с ними. В качестве источника данных может быть файл, устройство ввода-вывода, принтер.
Класс Stream является абстрактным базовым классом для всех потоковых классов в Си-шарп. Для работы с файлами нам понадобится класс FileStream(файловый поток).
FileStream - представляет поток, который позволяет выполнять операции чтения/записи в файл.
static void Main(string[] args)
{ FileStream file = new FileStream("d:\\test.txt", FileMode.Open
, FileAccess.Read); //открывает файл только на чтение
}
Режимы открытия FileMode:
- Append – открывает файл (если существует) и переводит указатель в конец файла (данные будут дописываться в конец), или создает новый файл. Данный режим возможен только при режиме доступа FileAccess.Write.
- Create - создает новый файл(если существует – заменяет).
- CreateNew – создает новый файл (если существует – генерируется исключение).
- Open - открывает файл (если не существует – генерируется исключение).
- OpenOrCreate – открывает файл, либо создает новый, если его не существует.
- Truncate – открывает файл, но все данные внутри файла затирает (если файла не существует – генерируется исключение).
static void Main(string[] args)
{
FileStream file1 = new FileStream("d:\\file1.txt", FileMode.CreateNew); //создание нового файла
FileStream file2 = new FileStream("d:\\file2.txt", FileMode.Open); //открытие существующего файла
FileStream file3 = new FileStream("d:\\file3.txt", FileMode.Append); //открытие файла на дозапись в конец файла
}
Режим доступа FileAccess:
- Read – открытие файла только на чтение. При попытке записи генерируется исключение.
- Write - открытие файла только на запись. При попытке чтения генерируется исключение.
- ReadWrite - открытие файла на чтение и запись.
Для чтения данных из потока нам понадобится класс StreamReader. В нем реализовано множество методов для удобного считывания данных. Ниже приведена программа, которая выводит содержимое файла на экран:
static void Main(string[] args)
{
FileStream file1 = new FileStream("d:\\test.txt", FileMode.Open); //создаем файловый поток
StreamReader reader = new StreamReader(file1); // создаем «потоковый читатель» и связываем его с файловым потоком
Console.WriteLine(reader.ReadToEnd()); //считываем все данные с потока и выводим на экран
reader.Close(); //закрываем поток
Console.ReadLine();
}
Метод ReadToEnd() считывает все данные из файла. ReadLine() – считывает одну строку (указатель потока при этом переходит на новую строку, и при следующем вызове метода будет считана следующая строка).
Свойство EndOfStream указывает, находится ли текущая позиция в потоке в конце потока (достигнут ли конец файла). Возвращает true или false.
Для записи данных в поток используется класс StreamWriter. Пример записи в файл:
static void Main(string[] args)
{
FileStream file1 = new FileStream("d:\\test.txt", FileMode.Create); //создаем файловый поток
StreamWriter writer = new StreamWriter(file1); //создаем «потоковый писатель» и связываем его с файловым потоком
writer.Write("текст"); //записываем в файл
writer.Close(); //закрываем поток. Не закрыв поток, в файл ничего не запишется
}
Метод WriteLine() записывает в файл построчно (то же самое, что и простая запись с помощью Write(), только в конце добавляется новая строка).
Нужно всегда помнить, что после работы с потоком, его нужно закрыть (освободить ресурсы), использовав метод Close().
Кодировка, в которой будут считываться/записываться данные указывается при создании StreamReader/StreamWriter:
static void Main(string[] args)
{
FileStream file1 = new FileStream("d:\\test.txt", FileMode.Open);
StreamReader reader = new StreamReader(file1, Encoding.Unicode);
StreamWriter writer = new StreamWriter(file1, Encoding.UTF8);
}
Кроме того, при использовании StreamReader и StreamWriter можно не создавать отдельно файловый поток FileStream, а сделать это сразу при создании StreamReader/StreamWriter:
static void Main(string[] args)
{
StreamWriter writer = new StreamWriter("d:\\test.txt"); //указываем путь к файлу, а не поток
writer.WriteLine("текст");
writer.Close();
}
Папка создаётся с помощью статического метода CreateDirectory() класса Directory:
static void Main(string[] args)
{ Directory.CreateDirectory("d:\\new_folder");}
Для удаления папок используется метод Delete():
static void Main(string[] args)
{ Directory.Delete("d:\\new_folder"); //удаление пустой папки }
Если папка не пустая, необходимо указать параметр рекурсивного удаления - true:
static void Main(string[] args)
{ Directory.Delete("d:\\new_folder", true); //удаление папки, и всего, что внутри }
Далее рассмотрим боле подробно.
Для работы с файлами предназначена пара классов File и FileInfo. С их помощью мы можем создавать, удалять, перемещать файлы, получать их свойства и многое другое.
Некоторые полезные методы и свойства класса FileInfo:
CopyTo(path): копирует файл в новое место по указанному пути path.
Create(): создает файл.
Delete(): удаляет файл.
MoveTo(destFileName): перемещает файл в новое место.
Свойство Directory: получает родительский каталог в виде объекта DirectoryInfo
Свойство DirectoryName: получает полный путь к родительскому каталогу.
Свойство Exists: указывает, существует ли файл.
Свойство Length: получает размер файла.
Свойство Extension: получает расширение файла.
Свойство Name: получает имя файла.
Свойство FullName: получает полное имя файла.
Класс File реализует похожую функциональность с помощью статических методов:
Copy(): копирует файл в новое место.
Create(): создает файл.
Delete(): удаляет файл.
Move: перемещает файл в новое место.
Exists(file): определяет, существует ли файл.