Similar presentations:
Язык программирования С#. Работа с формами и элементами управления
1.
ЧАСТЬ IIАвтор курса:
ННГАСУ - 2017
доцент каф. ИСТ
Кислицын Дмитрий Игоревич
1
2. Содержание 1
Работа с формами и элементами управленияОбработка событий
Создание второй формы
Передача данных между формами
Динамическое добавление/удаление контрола
Создание массива контролов
Обработка однотипный событий массива контролов
Класс Graphics. Построение графика функции
Работа с текстовым файлом
Выборка данных из XML-файла
Взаимодействие с MS Access
Взаимодействие с MS SQL Server
Основы LINQ
Язык программирования C# - Кислицын Д.И., 2017
2
3. Содержание 2
Основы LINQОбщая форма запроса
Отбор запрашиваемых значений с помощью оператора where
Сортировка результатов запроса с помощью оператора orderby
Операторы select и from
Группирование результатов с помощью оператора group
Продолжение запроса с помощью оператора into
Применение оператора let для создания временной переменной в запросе
Объединение двух последовательностей с помощью оператора join
Методы запроса
Режимы выполнения запросов: отложенный и немедленный
Использование LINQ для работы с XML-файлами
Использование LINQ для работы с базами данных
Язык программирования C# - Кислицын Д.И., 2017
3
4. Что почитать
Герберт Шилдт - C# 4.0. Полное руководство, 2011https://docs.microsoft.com/ruru/dotnet/articles/csharp/programming-guide/index
MSDN. Руководство по программированию на C#
Казанский
А.
А.
Объектно-ориентированное
программирование на языке Microsoft Visual С# в среде
разработки Microsoft Visual Studio 2008 и .NET Framework 4.3 :
Учебное пособие и практикум, Москва : Московский
государственный строительный университет, ЭБС АСВ, 2013
Культин Н. Б. Microsoft Visual C# в задачах и примерах. – СПб.:
БХВ-Петербург, 2009. – 320 с.
https://metanit.com/sharp/ - программирование на C# и
платформе .NET
Язык программирования C# - Кислицын Д.И., 2017
4
5. Работа с формами и элементами управления
Язык программирования C# - Кислицын Д.И., 20175
6. Обработка событий
Язык программирования C# - Кислицын Д.И., 20176
7. Создание второй формы
Любая форма представляет из себя класс, унаследованный от Form.Экземпляр главной формы создается в файле Program.cs по умолчанию.
Чтобы отобразить вторую форму, надо создать экземпляр этого класса (Form2),
например в обработчике события главной.
ShowDialog() - блокирует главную форму, т.е. управление вернется в нее, только по
закрытию второй формы,
.
Show()
- просто отображает вторую форму (будут доступны обе формы)
Form2 f2;
private void button1_Click(object sender, EventArgs e)
{
if (f2 == null || f2.IsDisposed ) // f2 не создана или была закрыта
{
f2 = new Form2();
f2.Show();
}
}
Для передачи данных между формами необходимо передать в конструктор f2
текущую форму
f2 = new Form2(this);
Язык программирования C# - Кислицын Д.И., 2017
7
8. Передача данных из Form1 в Form2
Изменение в конструкторе Form2Form1 f1;
public Form2(Form1 f)
{
f1 = f;
InitializeComponent();
}
Передача из textBox1 Form1 в textBox1 Form2
public string data
{
get
{
return this.textBox1.Text;
}
set
{
this.textBox1.Text = value;
}
}
try
{
f2.data = this.textBox1.Text; // data - public string data, т.к.
}
//
TextBox по умолчанию private
catch
{
f2 = new Form2(this);
f2.data = this.textBox1.Text;
f3.Show();
}
Язык программирования C# - Кислицын Д.И., 2017
8
9. Передача данных из Form1 в Form2
Язык программирования C# - Кислицын Д.И., 20179
10. Динамическое добавление/удаление контрола
(Добавление)Пример динамического создания кнопки:
System.Windows.Forms.Button button1 = new System.Windows.Forms.Button();
// создаем контрол
button1.Location = new System.Drawing.Point(101, 50);
// устанавливаем необходимые свойства
button1.Name = "button1";
button1.Size = new System.Drawing.Size(75, 23);
button1.TabIndex = 0; button1.Text = "button1";
button1.UseVisualStyleBackColor = true;
button1.Click += new System.EventHandler(button1_Click);
// button1_Click - функция обработчик события нажатия на кнопку
Controls.Add(button1);
// добавляем на форму
Язык программирования C# - Кислицын Д.И., 2017
10
11. Динамическое добавление/удаление контрола
(Удаление)Controls.Remove(button1);
button1.Dispose(); // освобождает ресурсы
Язык программирования C# - Кислицын Д.И., 2017
11
12. Создание массива контролов
Создание массива контроловTextBox[] tb = new TextBox[10];
for (int i = 0; i < tb.Length; i++) {
tb[i] = new System.Windows.Forms.TextBox();
tb[i].Location = new System.Drawing.Point(101, 50 + i * 30);
tb[i].Name = "textBox" + i.ToString();
tb[i].Size = new System.Drawing.Size(75, 23);
tb[i].TabIndex = i;
tb[i].Text = "textBox" + i.ToString();
Controls.Add(tb[i]);
}
Язык программирования C# - Кислицын Д.И., 2017
12
13. Обработка однотипный событий массива контролов
Обработка однотипный событий массиваLabel [,] lbs;
контролов
private void button1_Click(object sender, EventArgs e)
{
lbs = new Label [n,n];
for (i = 0; i < n; i++)
for ( j = 0; j < n; j++)
{
Label lb=new Label();
lb.Location = new System.Drawing.Point(50 + i * 25, 50 + j * 25);
lb.Name = "lb" + i.ToString() + j.ToString();
lb.Size = new System.Drawing.Size(25, 25);
lb.Text = "[ ]";
lb.Click += new System.EventHandler(lb_Click);
Controls.Add(lb);
lbs[i,j]=lb;
}
}
void lb_Click(object sender, EventArgs e)
{
Label lb = (Label )sender;
lb.text=“X”;
Язык программирования C# - Кислицын Д.И., 2017
13
}
14.
КлассGraphics
предоставляет методы для рисования
Класс Graphics
объектов
отображения. A Graphics связан с конкретным контекстом устройства
public partial class Form1 : Form
{
string text = "TEXT";
public Form1()
{
Initialize Component();
}
private void Form_resize(object sender, EventArgs e)
{
this.Refresh();
}
private void Form_Paint(object sender, PaintEventArgs e)
{
Font sfont = new Font("Tahoma", 16, FontStyle.Italic);
//sfont=this.Font;
int w = (int)e.Graphics.MeasureString(text, sfont).Width;
int h = (int)e.Graphics.MeasureString(text, this.Font).Height;
int x = (this.ClientSize.Width - w) / 2;
int y = (this.ClientSize.Height - h) / 2;
e.Graphics.DrawString(text, sfont, Brushes.BlueViolet, x, y);
}
Язык программирования
C# - Кислицын Д.И., 2017
14
}
на
устройстве
15.
Класс Graphicsprivate void panel1_Paint(object sender, PaintEventArgs e)
{
int W = pictureBox1.Width, H = pictureBox1.Height;
int halfW = W / 2, halfH = H / 2;
e.Graphics.DrawLine(Pens.Black, halfW, 0, halfW, H);
e.Graphics.DrawLine(Pens.Black, 0, halfH, W, halfH);
}
private void hScrollBar1_Scroll(object sender, ScrollEventArgs e)
{
a = hScrollBarA.Value / 10.0;
tbA.Text = a.ToString(); ;
pictureBox1.Refresh();
}
Язык программирования C# - Кислицын Д.И., 2017
15
16.
Класс GraphicsЯзык программирования C# - Кислицын Д.И., 2017
16
17.
Класс GraphicsПостроение круговой диаграммы
Построение границы сектора
Заливка сектора
// длина дуги
sweepAngle = (int)(360 * p[i]); доля
Язык программирования C# - Кислицын Д.И., 2017
17
// задать цвет сектора
switch (i)
{
case 0:
brush = Brushes.YellowGreen;
break;
case 1:
brush = Brushes.Gold;
break;
case 2:
brush = Brushes.Pink;
break;
}
18.
Класс GraphicsПостроение круговой диаграммы
private void Form1_Paint(object sender, PaintEventArgs e)
{
// графическая поверхность
Graphics g = e.Graphics;
// диаметр диаграммы
int d = ClientSize.Height - 70;
int x0 = 30;
int y0 = (ClientSize.Height - d) / 2 + 10;
// длинна дуги сектора
int swe;
// кисть для заливки сектора диаграммы
Brush fBrush = Brushes.White;
// начальная точка дуги сектора
int sta = 0;
// рисуем диаграмму
for (int i = 0; i < 4; i++)
{
// длинна дуги
swe = (int)(360 * 0.2);
// задать цвет сектора
switch (i)
{
case 0:
fBrush = Brushes.YellowGreen;
break;
case 1:
fBrush = Brushes.Gold;
break;
case 2:
fBrush = Brushes.Pink;
break;
case 3:
Язык программирования
C# - Кислицын Д.И., 2017
fBrush = Brushes.Violet;
break;
}
if (i == 4 - 1)
{
// последний сектор
swe = 360 - sta;
}
// рисуем сектор
g.FillPie(fBrush, x0, y0, d, d, sta, swe);
// рисуем границу сектора
g.DrawPie(System.Drawing.Pens.Black, x0, y0, d, d, sta, swe);
// начальная точка дуги для следующего сектора
sta = sta + swe;
}
}
18
19. Работа с текстовым файлом
Для работы с текстовыми файлами проще всего воспользоваться потокамиклассов StreamWriter и StreamReader. Для работы с потоками необходимо
подключить библиотеку System.IO.
Using System.IO;
Режимы работы с файлом:
1. Запись в файл
1) Создание нового файла и запись в него строк
2) Дописывание строк в существующий файл
2. Чтение существующего файла
Язык программирования C# - Кислицын Д.И., 2017
19
20. Работа с текстовым файлом
Запись в новый текстовый файл1. Создать файл методом File.CreateText() и открыть поток для
записи в файл через класс StreamWriter
StreamWriter sw = File.CreateText("test.txt");
2. Записать строку(и) используя методы Write() и WriteLine()
sw.WriteLine("Мой первый файл, созданный в C#");
3. Закрыть поток используя метод Close()
sw.Close();
Язык программирования C# - Кислицын Д.И., 2017
20
21. Работа с текстовым файлом
Дописывание в существующий файл1. Создать поток (через класс StreamWriter) и указать режим
добавления в файл методом AppendText()
StreamWriter sw = File.AppendText("test.txt");
2. Записать строку(и)
sw.WriteLine("Добавили вторую строчку в файл");
3. Закрыть поток
sw.Close();
Язык программирования C# - Кислицын Д.И., 2017
21
22. Работа с текстовым файлом
Чтение из текстового файла1.1. Открыть поток класса StreamReader, привязав его к файлу методом
File.OpenText(‘имя файла’).
StreamReader sr = File.OpenText("test.txt");
2. Считать (например, в консоль):
- одну строку из файла методом ReadLine()
System.Console.WriteLine(sr.ReadLine());
- все строки из файла
while (true)
{
string st = sr.ReadLine();
if (st==null)
break;
System.Console.WriteLine(st);
}
3. Закрыть поток используя метод Close()
sr.Close();
Язык программирования C# - Кислицын Д.И., 2017
22
23. Работа с текстовым файлом
ПримерStreamWriter sw = File.CreateText("test.txt");
sw.WriteLine("Первая строка");
sw.WriteLine("Вторая строка");
sw.Close();
StreamReader sr = File.OpenText("test.txt");
while (true)
{
string st = sr.ReadLine();
if (st==null)
break;
System.Console.WriteLine(st);
}
sw.Close();
System.Console.ReadLine();
Язык программирования C# - Кислицын Д.И., 2017
23
24. Работа с текстовым файлом
openFileDialog1.InitialDirectory = "c:\\";openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
openFileDialog1.FilterIndex = 1;
openFileDialog1.ShowDialog(); // выбор файла
openFileDialog1.FileName; // содержит путь к выбранному файлу
Язык программирования C# - Кислицын Д.И., 2017
24
25. Работа с текстовым файлом
Задание:1) написать класс по работе с текстовым файлом,
позволяющий создавать файл, дописывать в файл,
читать из файла, удалять файл, копировать файл,
шифровать файл, определять число строк в файле;
2) на основе разработанного класса написать простой
текстовый редактор.
Язык программирования C# - Кислицын Д.И., 2017
25
26. Работа с XML
class User{
public string Name { get; set; }
public int Age { get; set; }
public string Company { get; set; }
}
User user1 = new User { Name = "Bill Gates", Age = 48, Company = "Microsoft" };
User user2 = new User { Name = "Larry Page", Age = 42, Company = "Google" };
List<User> users = new List<User> { user1, user2 };
<?xml version="1.0" encoding="utf-8" ?>
<users>
<user name="Bill Gates">
<company>Microsoft</company>
<age>48</age>
</user>
Атрибут
<user name="Larry Page">
<company>Google</company>
<age>48</age>
</user>
</users>
Язык программирования C# - Кислицын Д.И., 2017
Объявляется XML-документ версии 1.0 с кодировкой utf-8
Корневой элемент users
Элемент user с атрибутом name
и вложенными элементами company
и age
<?xml version="1.0" encoding="utf-8" ?>
<users>
<user>
<name>Bill Gates</name>
<company>Microsoft</company>
name
<age>48</age>
</user>
<user>
Вложенный элемент
<name>Larry Page</name>
<company>Google</company>
<age>48</age>
26
</user>
</users>
27. Работа с XML с помощью классов System.Xml
Классы для работы с XMLXmlNode - представляет узел xml. В качестве узла может использоваться весь
документ, так и отдельный элемент
XmlDocument - представляет весь xml-документ
XmlElement - представляет отдельный элемент. Наследуется от класса XmlNode
XmlAttribute - представляет атрибут элемента
XmlText - представляет значение элемента в виде текста, то есть тот текст, который
находится в элементе между его открывающим и закрывающим тегами
XmlComment - представляет комментарий в xml
XmlNodeList - используется для работы со списком узлов
Свойства класса XmlNode:
Attributes - возвращает объект XmlAttributeCollection, который представляет
коллекцию атрибутов
ChildNodes - возвращает коллекцию дочерних узлов для данного узла
HasChildNodes - возвращает true, если текущий узел имеет дочерние узлы
FirstChild - возвращает первый дочерний узел
LastChild - возвращает последний дочерний узел
InnerText - возвращает текстовое значение узла
InnerXml - возвращает всю внутреннюю разметку xml-узла
Name - возвращает название узла (значение свойства Name равно "user”)
Язык программирования C# - Кислицын Д.И., 2017
ParentNode - возвращает родительский27узел у текущего узла
28. Работа с XML с помощью классов System.Xml
using System.Xml;class Program
{
static void Main(string[] args)
{
XmlDocument xDoc = new XmlDocument();
xDoc.Load("users.xml");
// получим корневой элемент
XmlElement xRoot = xDoc.DocumentElement;
// обход всех узлов в корневом элементе
foreach(XmlNode xnode in xRoot)
<?xml version="1.0" encoding="utf-8" ?>
{
<users>
// получаем атрибут name
if(xnode.ChildNodes.Count>0)
<user name="Bill Gates">
{
<company>Microsoft</company>
XmlNode attr = xnode.Attributes.GetNamedItem("name");
<age>48</age>
if (attr!=null)
</user>
Console.WriteLine(attr.Value);
<user name="Larry Page">
}
<company>Google</company>
// обходим все дочерние узлы элемента user
<age>42</age>
foreach(XmlNode childnode in xnode.ChildNodes)
{
</user>
// если узел - company
</users>
if(childnode.Name=="company")
{
Console.WriteLine("Компания: {0}", childnode.InnerText);
}
// если узел age
if (childnode.Name == "age")
{
Console.WriteLine("Возраст: {0}", childnode.InnerText);
}
}
Console.WriteLine();
}
Язык программирования
C# - Кислицын Д.И., 2017
28
Console.Read();
}
}
Чтение XML-документа
29. Работа с XML с помощью классов System.Xml
Чтение XML-документаList<User> users = new List<User>();
Users.xml
<?xml version="1.0" encoding="utf-8" ?>
<users>
<user name="Bill Gates">
<company>Microsoft</company>
<age>48</age>
</user>
<user name="Larry Page">
<company>Google</company>
<age>42</age>
</user>
</users>
XmlDocument xDoc = new XmlDocument();
xDoc.Load("users.xml");
XmlElement xRoot = xDoc.DocumentElement;
foreach(XmlElement xnode in xRoot)
{
User user = new User();
if (xnode.ChildNodes.Count > 0)
{
XmlNode attr = xnode.Attributes.GetNamedItem("name");
class User
if (attr!=null)
{
user.Name=attr.Value;
public string Name { get; set; }
}
public int Age { get; set; }
foreach (XmlNode childnode in xnode.ChildNodes)
public string Company { get; set; }
{
}
if (childnode.Name == "company")
user.Company=childnode.InnerText;
if (childnode.Name == "age")
user.Age = Int32.Parse(childnode.InnerText);
}
users.Add(user);
}
foreach (User u in users)
Console.WriteLine("{0}
- {2}", u.Name,
Язык программирования
C# - Кислицын Д.И., ({1})
2017
29 u.Company, u.Age);
30. Работа с XML с помощью классов System.Xml
Редактирование XML-документа(добавление, изменение, удаление элементов)
Методы класса XmlNode:
•AppendChild - добавляет в конец текущего узла новый дочерний узел
•InsertAfter - добавляет новый узел после определенного узла
•InsertBefore - добавляет новый узел до определенного узла
•RemoveAll - удаляет все дочерние узлы текущего узла
•RemoveChild - удаляет у текущего узла один дочерний узел и возвращает его
Методы класса XmlElement
•CreateNode - создает узел любого типа
•CreateElement - создает узел типа XmlDocument
•CreateAttribute - создает узел типа XmlAttribute
•CreateTextNode - создает узел типа XmlTextNode
•CreateComment - создает комментарий
Язык программирования C# - Кислицын Д.И., 2017
30
31. Работа с XML с помощью классов System.Xml
Редактирование XML-документа(добавление элементов)
XmlDocument xDoc = new XmlDocument();
xDoc.Load(“Users.xml");
XmlElement xRoot = xDoc.DocumentElement;
// создаем новый элемент user
XmlElement userElem = xDoc.CreateElement("user");
// создаем атрибут name
XmlAttribute nameAttr = xDoc.CreateAttribute("name");
// создаем элементы company и age
XmlElement companyElem = xDoc.CreateElement("company");
XmlElement ageElem = xDoc.CreateElement("age");
// создаем текстовые значения для элементов и атрибута
XmlText nameText = xDoc.CreateTextNode("Mark Zuckerberg");
XmlText companyText = xDoc.CreateTextNode("Facebook");
XmlText ageText = xDoc.CreateTextNode("30");
//добавляем узлы
nameAttr.AppendChild(nameText);
companyElem.AppendChild(companyText);
ageElem.AppendChild(ageText);
userElem.Attributes.Append(nameAttr);
userElem.AppendChild(companyElem);
userElem.AppendChild(ageElem);
xRoot.AppendChild(userElem);
xDoc.Save(“Users1.xml");
Язык программирования C# - Кислицын Д.И., 2017
31
Users.xml
<?xml version="1.0" encoding="utf-8" ?>
<users>
<user name="Bill Gates">
<company>Microsoft</company>
<age>48</age>
</user>
<user name="Larry Page">
<company>Google</company>
<age>42</age>
</user>
</users>
Users1.xml
<?xml version="1.0" encoding="utf-8" ?>
<users>
<user name="Bill Gates">
<company>Microsoft</company>
<age>48</age>
</user>
<user name="Larry Page">
<company>Google</company>
<age>42</age>
</user>
<user name="Mark Zuckerberg">
<company>Facebook</company>
<age>30</age>
</user>
</users>
32. Работа с XML с помощью классов System.Xml
Редактирование XML-документа(удаление элементов)
XmlDocument xDoc = new XmlDocument();
xDoc.Load(“Users.xml");
XmlElement xRoot = xDoc.DocumentElement;
XmlNode firstNode = xRoot.FirstChild;
xRoot.RemoveChild(firstNode);
xDoc.Save(“Users2.xml");
Users.xml
<?xml version="1.0" encoding="utf-8" ?>
<users>
<user name="Bill Gates">
<company>Microsoft</company>
<age>48</age>
</user>
<user name="Larry Page">
<company>Google</company>
<age>42</age>
</user>
</users>
Users2.xml
<?xml version="1.0" encoding="utf-8" ?>
<users>
<user name="Larry Page">
<company>Google</company>
<age>42</age>
</user>
</users>
Язык программирования C# - Кислицын Д.И., 2017
32
33. Строка подключения
Взаимодействие с БДСтрока подключения
https://www.connectionstrings.com/
Создание строки подключения через OLE DB
Cоздать текстовый файл и изменить расширение с txt на udl.
Может
понадобиться
https://www.microsoft.c
om/enus/download/details.as
px?id=13255
Microsoft Access
Database Engine 2010
Redistributable
[oledb]
Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=11;
Data Source=DMITRIY\SQLEXPRESS
Язык программирования C# - Кислицын Д.И., 2017
33
34. Подключение и выполнение запроса через OLEDB
Взаимодействие с БДПодключение и выполнение запроса через OLEDB
// Подключение через OLEDB
using System.Data.OleDb;
string connect="Provider=Microsoft.ACE.OLEDB.12.0; // строка подключения к MS Access
Data Source=C:\\Users\\base.accdb; Jet OLEDB:Database Password=0";
// Создание строки подключения к БД через OleDB
OleDbConnection cn = new OleDbConnection(connect);
//Подготовка SQL-запроса
string query = "SELECT * FROM Table1";
//Загрузка в DataSet и DataTable
OleDbDataAdapter adapterOleDb = new OleDbDataAdapter(query, cn);
DataSet ds = new DataSet();
adapterOleDb.Fill(ds);
DataTable dt = ds.Tables[0];
dataGridView1.DataSource = dt;
dt.Dispose();
ds.Dispose();
Язык программирования C# - Кислицын Д.И., 2017
cn.Close();
34
35. Подключение и выполнение запроса через SqlClient
Взаимодействие с БДПодключение и выполнение запроса через SqlClient
// Подключение через SqlClient
using System.Data.SqlClient;
string connect= "Data Source= Server ;Initial Catalog= Database ;Integrated Security=True";
//Подготовка SQL-запроса
string query = "SELECT * FROM Table1";
//Загрузка в DataSet и DataTable
SqlDataAdapter adapterSql = new SqlDataAdapter(query, connect);
DataSet ds = new DataSet();
adapterSql.Fill(ds);
DataTable dt = ds.Tables[0];
//Загрузка в dataGridView
dataGridView1.DataSource = dt;
dt.Dispose();
ds.Dispose();
Язык программирования C# - Кислицын Д.И., 2017
35
36. Обновление данных из DataGridView в MS SQL Server через SqlCommandBuilder
Взаимодействие с БДОбновление данных из DataGridView в MS SQL Server через SqlCommandBuilder
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(adapterSql ) ;
adapterSql.Update(ds);
// adapter.Update(dt); //обновление только одной таблицы
ds.Clear(); // очищаем полностью DataSet
adapterSql.Fill(ds); // перезагружаем данные
Язык программирования C# - Кислицын Д.И., 2017
36
37. Доступ к ячейке DataTable и DataGridView
Взаимодействие с БДДоступ к ячейке DataTable и DataGridView
Доступ к ячейке DataTable
dt.Rows[0][0].ToString();
Доступ к ячейке DataGridView
dataGridView1[0, 0].Value.ToString();
Язык программирования C# - Кислицын Д.И., 2017
37
38. Делегаты
Делегат представляет собой объект, который может ссылаться на метод.Следовательно, когда создается делегат, то в итоге получается объект,
содержащий ссылку на метод, т.е. делегат позволяет вызывать метод, на
который он ссылается.
Объект делегата поддерживает три важных фрагмента информации:
адрес метода, на котором он вызывается;
аргументы (если есть) этого метода;
возвращаемое значение (если есть) этого метода.
Определение типа делегата в C#:
delegate возвращаемый_тип имя (список_параметров);
Делегат может служить для вызова любого метода с соответствующей
сигнатурой и возвращаемым типом.
Язык программирования C# - Кислицын Д.И., 2017
38
39. Делегаты
using System;namespace ConsoleApplication1 {
delegate int IntOperation (int i, int j); // Создадим делегат
class Program {
static int Sum(int x, int y) {
return x + y;
}
static int Prz(int x, int y) {
return x * y;
}
static int Del(int x, int y) {
return x / y;
}
static void Main() {
// Сконструируем делегат
IntOperation op1 = new IntOperation(Sum);
int result = op1(5, 10);
Console.WriteLine("Сумма: " + result);
// Изменим ссылку на метод
op1 = new IntOperation(Prz);
result = op1(5, 10);
Console.WriteLine("Произведение: " + result);
}
}
Язык программирования
C# - Кислицын Д.И., 2017
39
}
40. Основы LINQ
Общая форма запросаМетоды расширения LINQ
Лямбда-выражения
Фильтрация (Where)
Сложные фильтры
Проекция
Переменные в запросах и оператор let
Выборка из нескольких источников
Сортировка результатов запроса с помощью оператора orderby
Группирование результатов с помощью оператора group
Продолжение запроса с помощью оператора into
Объединение двух последовательностей с помощью оператора join
Методы запроса
Режимы выполнения запросов: отложенный и немедленный
Использование LINQ для работы с XML-файлами
Использование LINQ для работы с базами дан
Язык программирования C# - Кислицын Д.И., 2017
40
41. Основы LINQ
LINQ - технология Microsoft, предназначенная для поддержки запросовк данным всех типов на уровне языка. Эти типы включают массивы и
коллекции в памяти, базы данных, документы XML и многое другое
Язык программирования C# - Кислицын Д.И., 2017
41
42. Основы LINQ
string[] teams = {"Бавария", "Боруссия", "Реал Мадрид", "Манчестер Сити", "ПСЖ", "Барселона"};var selectedTeams = new List<string>();
foreach(string s in teams)
{
if (s.ToUpper().StartsWith("Б"))
selectedTeams.Add(s);
}
selectedTeams.Sort();
без LINQ
foreach (string s in selectedTeams)
Console.WriteLine(s);
using System.LINQ
string[] teams = {"Бавария", "Боруссия", "Реал Мадрид", "Манчестер Сити", "ПСЖ",
"Барселона"};
var selectedTeams = from t in teams // определяем каждый объект из teams как t
where t.ToUpper().StartsWith("Б") //фильтрация по критерию
orderby t // упорядочиваем по возрастанию
с LINQ
select t; // выбираем объект
foreach (string s in selectedTeams)
Console.WriteLine(s);
Язык программирования C# - Кислицын Д.И., 2017
42
43. Основы LINQ
Простейшее определение запроса LINQ :from переменная in набор_объектов select переменная;
Методы расширения LINQ
Select: определяет проекцию выбранных значений
Where: определяет фильтр выборки
OrderBy: упорядочивает элементы по возрастанию
OrderByDescending: упорядочивает элементы по убыванию
ThenBy: задает дополнительные критерии для упорядочивания элементов возрастанию
ThenByDescending: задает дополнительные критерии для упорядочивания элементов по убыванию
Join: соединяет две коллекции по определенному признаку
GroupBy: группирует элементы по ключу
ToLookup: группирует элементы по ключу, при этом все элементы добавляются в словарь
GroupJoin: выполняет одновременно соединение коллекций и группировку элементов по ключу
Reverse: располагает элементы в обратном порядке
All: определяет, все ли элементы коллекции удовлетворяют определенному условию
Any: определяет, удовлетворяет хотя бы один элемент коллекции определенному условию
Язык программирования C# - Кислицын Д.И., 2017
43
44. Основы LINQ
Методы расширения LINQContains: определяет, содержит ли коллекция определенный элемент
Distinct: удаляет дублирующиеся элементы из коллекции
Except: возвращает разность двух коллекцию, то есть те элементы, которые содержатся только в
одной коллекции
Union: объединяет две однородные коллекции
Intersect: возвращает пересечение двух коллекций, то есть те элементы, которые встречаются в
обоих коллекциях
Count: подсчитывает количество элементов коллекции, которые удовлетворяют определенному
условию
Sum: подсчитывает сумму числовых значений в коллекции
Average: подсчитывает cреднее значение числовых значений в коллекции
Min: находит минимальное значение
Max: находит максимальное значение
Take: выбирает определенное количество элементов
Skip: пропускает определенное количество элементов
TakeWhile: возвращает цепочку элементов последовательности, до тех пор, пока условие истинно
SkipWhile: пропускает элементы в последовательности, пока они удовлетворяют заданному
условию, и затем возвращает оставшиеся элементы
Concat: объединяет две коллекции
Zip: объединяет две коллекции в соответствии с определенным условием
Язык программирования C# - Кислицын Д.И., 2017
44
45. Основы LINQ
Методы расширения LINQFirst: выбирает первый элемент коллекции
FirstOrDefault: выбирает первый элемент коллекции или возвращает значение по умолчанию
Single: выбирает единственный элемент коллекции, если коллекция содержит больше или меньше
одного элемента, то генерируется исключение
SingleOrDefault: выбирает первый элемент коллекции или возвращает значение по умолчанию
ElementAt: выбирает элемент последовательности по определенному индексу
ElementAtOrDefault: выбирает элемент коллекции по определенному индексу или возвращает
значение по умолчанию, если индекс вне допустимого диапазона
Last: выбирает последний элемент коллекции
LastOrDefault: выбирает последний элемент коллекции или возвращает значение по умолчанию
Язык программирования C# - Кислицын Д.И., 2017
45
46. Основы LINQ
string[] teams = {"Бавария", "Боруссия", "Реал Мадрид", "Манчестер Сити", "ПСЖ","Барселона"};
var selectedTeams = from t in teams // определяем каждый объект из teams как t
where t.ToUpper().StartsWith("Б") //фильтрация по критерию
orderby t // упорядочиваем по возрастанию
select t; // выбираем объект
foreach (string s in selectedTeams)
Console.WriteLine(s);
string[] teams = { "Бавария", "Боруссия", "Реал Мадрид", "Манчестер Сити", "ПСЖ",
"Барселона" };
var selectedTeams = teams.Where(t=>t.ToUpper().StartsWith("Б")).OrderBy(t => t);
foreach (string s in selectedTeams)
Console.WriteLine(s);
Язык программирования C# - Кислицын Д.И., 2017
с использованием лямбда-выражений
46
47.
Основы LINQЛямбда-выражения
Лямбда-выражения определяются как разделенный запятыми список
параметров, за которым следует лямбда-операция, а за ней — выражение или блок
операторов. Если параметров более одного, входные параметры помещаются в
скобки. В C# лямбда-операция записывается как =>. Таким образом, лямбдавыражение в C# выглядит подобно следующему:
(параметр1, параметр2, параметр3) => выражение
x => x // ввод х возвращает х
(х, у) => x == у // ввод х,y возвращает результат логического выражения x == у
Или, когда требуется более высокая сложность, может применяться блок
операторов:
(параметр1, параметр2, параметр3) =>
{
(x, y) =>
{
оператор1;
if(x > y)
оператор2;
return(x);
оператор3;
else
return(тип_возврата_лямбда_выражения);
return(y);
}
}
Язык программирования C# - Кислицын Д.И., 2017
47
48. Основы LINQ
Лямбда-выраженияstring[] numbers = { "40", "2012", "176", "5" };
// Преобразуем массив строк в массив типа int и сортируем по возрастанию
используя LINQ
int[] nums = numbers.Select(s => Int32.Parse(s)).OrderBy(s => s).ToArray();
Язык программирования C# - Кислицын Д.И., 2017
48
49.
Основы LINQФильтрация (Where)
int[] numbers = { 1, 2, 3, 4, 10, 34, 55, 66, 77, 88 };
IEnumerable<int> evens = from i in numbers
where i%2==0 && i>10
select i;
foreach (int i in evens)
Console.WriteLine(i);
все четные
элементы, которые
больше 10
int[] numbers = { 1, 2, 3, 4, 10, 34, 55, 66, 77, 88 };
IEnumerable<int> evens = numbers.Where(i => i % 2 == 0 && i > 10);
Язык программирования C# - Кислицын Д.И., 2017
49
50. Основы LINQ
Фильтрация (Where)string[] names = { "Adams", "Arthur", "Buchanan", "Bush", "Carter", "Cleveland",
"Clinton", "Coolidge", "Eisenhower", "Fillmore", "Ford", "Garfield", "Grant", "Harding",
"Harrison", "Hayes", "Hoover", "Jackson", "Jefferson", "Johnson", "Kennedy",
"Lincoln", "Madison", "McKinley", "Monroe", "Nixon", "Obama", "Pierce", "Polk",
"Reagan", "Roosevelt", "Taft", "Taylor", "Truman", "Tyler", "Van Buren", "Washington",
"Wilson"};
// Использование точечной нотации
IEnumerable<string> sequence = names
.Where(n => n.Length < 6)
.Select(n => n);
// Использование синтаксиса выражения запроса
IEnumerable<string> sequence = from n in names
where n.Length < 6
select n;
foreach (string name in sequence) {
Console.WriteLine("{0}", name);
}
Язык программирования C# - Кислицын Д.И., 2017
50
51. Основы LINQ
Сложные фильтрыclass User {
public string Name { get;set; }
public int Age { get; set; }
public List<string> Languages { get; set; }
public User() {
Languages = new List<string>();
}
}
List<User> users = new List<User>
{
new User {Name="Том", Age=23, Languages = new List<string> {"английский", "немецкий" }},
new User {Name="Боб", Age=27, Languages = new List<string> {"английский", "французский" }},
new User {Name="Джон", Age=29, Languages = new List<string> {"английский", "испанский" }},
new User {Name="Элис", Age=24, Languages = new List<string> {"испанский", "немецкий" }}
};
var selectedUsers = users.SelectMany
(u => u.Languages,
(u, l) => new { User = u, Lang = l })
.Where(u => u.Lang ==
"английский" && u.User.Age < 28)
.Select(u=>u.User);
var selectedUsers = from user in users
from lang in user.Languages
where user.Age < 28
where lang == "английский"
select user;
Язык программирования C# - Кислицын Д.И., 2017
51
52. Основы LINQ
ПроекцияПроекция позволяет спроектировать из текущего типа выборки какой-то
другой тип. Для проекции используется оператор select.
class User
{
public string Name { get;set; }
public int Age { get; set; }
}
List<User> users = new List<User>();
users.Add(new User { Name = "Sam", Age = 43 });
users.Add(new User { Name = "Tom", Age = 33 });
var names = from u in users select u.Name;
foreach (string n in names)
Console.WriteLine(n);
Язык программирования C# - Кислицын Д.И., 2017
52
53. Основы LINQ
Переменные в запросах и оператор letList<User> users = new List<User>()
{
new User { Name = "Sam", Age = 43 },
new User { Name = "Tom", Age = 33 }
};
var people = from u in users
let name = "Mr. " + u.Name
select new
{
Name = name,
Age = u.Age
};
foreach (var n in people)
Console.WriteLine("{0} - {1}", n.Name, n.Age );
Язык программирования C# - Кислицын Д.И., 2017
53
54. Основы LINQ
class PhoneВыборка из нескольких источников
{
public string Name { get; set; }
public string Company { get; set; }
}
class User
{
public string Name { get; set; }
public int Age { get; set; }
}
List<User> users = new List<User>()
{
new User { Name = "Sam", Age = 43 },
new User { Name = "Tom", Age = 33 }
};
List<Phone> phones = new List<Phone>()
{
new Phone {Name="Lumia 630", Company="Microsoft" },
new Phone {Name="iPhone 6", Company="Apple"},
};
var people = from user in users
from phone in phones
select new { Name = user.Name, Phone = phone.Name };
foreach (var p in people)
Console.WriteLine("{0} - {1}", p.Name, p.Phone);
Язык программирования C# - Кислицын Д.И., 2017
54
55. Основы LINQ
Использование LINQ для работы с XML-файлами (LINQ to XML)Пространство имен System.Xml.Linq
Основные классы System.Xml.Linq:
• XDocument - представляет весь xml-документ
• XElement - представляет отдельный xml-элемент
• XAttribute - представляет атрибут xml-элемента
• XComment - представляет комментарий
Ключевым классом является XElement, который позволяет получать вложенные
элементы и управлять ими
Методы класса XElement:
• Add() - добавляет новый атрибут или элемент
• Attributes() - возвращает коллекцию атрибутов для данного элемента
• Elements() - возвращает все дочерние элементы данного элемента
• Remove() - удаляет данный элемент из родительского объекта
• RemoveAll() - удаляет все дочерние элементы и атрибуты у данного элемента
Язык программирования C# - Кислицын Д.И., 2017
55
56. Основы LINQ
LINQ to XML (Создание XML-файла)XDocument xdoc = new XDocument();
XElement iphone = new XElement("phone"); // создаем первый элемент
XAttribute iphoneNameAttr = new XAttribute("name", "iPhone"); // создаем атрибут
XElement iphoneCompanyElem = new XElement("company", "Apple");
XElement iphonePriceElem = new XElement("price", "40000");
iphone.Add(iphoneNameAttr); // добавляем атрибут и элементы в первый элемент
iphone.Add(iphoneCompanyElem);
iphone.Add(iphonePriceElem);
<?xml version="1.0" encoding="utf-8"?>
<phones>
// создаем второй элемент
<phone name="iPhone">
XElement galaxy = new XElement("phone");
<company>Apple</company>
<price>40000</price>
XAttribute galaxyNameAttr = new XAttribute("name", "Samsung Galaxy");
</phone>
XElement galaxyCompanyElem = new XElement("company", "Samsung"); <phone name="Samsung Galaxy">
XElement galaxyPriceElem = new XElement("price", "33000");
<company>Samsung</company>
<price>33000</price>
galaxy.Add(galaxyNameAttr);
</phone>
galaxy.Add(galaxyCompanyElem);
</phones>
galaxy.Add(galaxyPriceElem);
XElement phones = new XElement("phones"); // создаем корневой элемент
phones.Add(iphone); // добавляем в корневой элемент
phones.Add(galaxy);
xdoc.Add(phones); // добавляем корневой элемент в документ
xdoc.Save("phones.xml"); //сохраняем документ
Язык программирования C# - Кислицын Д.И., 2017
56
57. Основы LINQ
LINQ to XML (Создание XML-файла)XDocument xdoc = new XDocument(new XElement("phones",
new XElement("phone",
new XAttribute("name", "iPhone"),
new XElement("company", "Apple"),
new XElement("price", "40000")),
new XElement("phone",
new XAttribute("name", "Samsung Galaxy"),
new XElement("company", "Samsung"),
new XElement("price", "33000"))));
xdoc.Save("phones.xml");
Язык программирования C# - Кислицын Д.И., 2017
57
<?xml version="1.0" encoding="utf-8"?>
<phones>
<phone name="iPhone">
<company>Apple</company>
<price>40000</price>
</phone>
<phone name="Samsung Galaxy">
<company>Samsung</company>
<price>33000</price>
</phone>
</phones>
58. Основы LINQ
LINQ to XML (Чтение XML-файла)XDocument xdoc = XDocument.Load("phones.xml");
foreach (XElement phoneElement in xdoc.Element("phones").Elements("phone"))
{
XAttribute nameAttribute = phoneElement.Attribute("name");
XElement companyElement = phoneElement.Element("company");
XElement priceElement = phoneElement.Element("price");
if (nameAttribute != null && companyElement!=null && priceElement!=null)
{
Console.WriteLine("Смартфон: {0}", nameAttribute.Value);
Console.WriteLine("Компания: {0}", companyElement.Value);
Console.WriteLine("Цена: {0}", priceElement.Value);
}
Console.WriteLine();
}
Язык программирования C# - Кислицын Д.И., 2017
58
<?xml version="1.0" encoding="utf-8"?>
<phones>
<phone name="iPhone">
<company>Apple</company>
<price>40000</price>
</phone>
<phone name="Samsung Galaxy">
<company>Samsung</company>
<price>33000</price>
</phone>
</phones>
59. Основы LINQ
LINQ to XML (Чтение XML-файла)<?xml version="1.0" encoding="utf-8"?>
<phones>
<phone name="iPhone">
<company>Apple</company>
<price>40000</price>
</phone>
<phone name="Samsung Galaxy">
<company>Samsung</company>
<price>33000</price>
</phone>
</phones>
class Phone
{
public string Name { get; set; }
public string Price { get; set; }
}
XDocument xdoc = XDocument.Load("phones.xml");
var items = from xe in xdoc.Element("phones").Elements("phone")
where xe.Element("company").Value=="Samsung"
select new Phone
{
Name = xe.Attribute("name").Value,
Price = xe.Element("price").Value
};
foreach (var item in items)
Console.WriteLine("{0} - {1}", item.Name, item.Price);
Язык программирования C# - Кислицын Д.И., 2017
59
Galaxy - 33000
60. Основы LINQ
LINQ to XML (Изменение XML-документа)XDocument xdoc = XDocument.Load("phones.xml");
XElement root = xdoc.Element("phones");
<?xml version="1.0" encoding="utf-8"?>
<phones>
<phone name="iPhone">
<company>Apple</company>
<price>40000</price>
</phone>
<phone name="Samsung Galaxy">
<company>Samsung</company>
<price>33000</price>
</phone>
</phones>
Язык программирования C# - Кислицын Д.И., 2017
foreach (XElement xe in root.Elements("phone").ToList())
{ // изменяем название и цену
if (xe.Attribute("name").Value == "Samsung Galaxy")
{
xe.Attribute("name").Value = "Samsung Galaxy Note 4";
xe.Element("price").Value = "31000";
}
//если iphone - удаляем его
else if (xe.Attribute("name").Value == "iPhone")
{
xe.Remove();
}
}
// добавляем новый элемент
root.Add(new XElement("phone",
new XAttribute("name", "Nokia Lumia 930"),
new XElement("company","Nokia"),
new XElement("price", "19500")));
xdoc.Save("pnones1.xml");
// выводим
xml-документ на консоль
60
Console.WriteLine(xdoc);
61. Основы LINQ
LINQtoSQL (Определение контекста данных и моделей)LINQtoSQL представляет технологию доступа и управления реляционными
данными. Данная технология позволяет составлять запросу к БД в удобной
форме в с помощью операторов LINQ, которые затем трансформируются в sqlвыражения. Ключевыми объектами здесь являются:
• сущности, которые хранятся в БД;
• контекст данных;
• запрос LINQ.
Для взаимодействия с БД в LINQtoSQL используются:
• модели (классы, которые сопоставляются с одной из таблиц в БД);
• контекст данных (представленный объектом DataContext
подключения), через который идёт работа с БД.
(строка
Для использования LINQtoSQL в проекте необходимо добавить библиотеку
System.Data.Linq.dll
и пространство имён
using System.Data.Linq.Mapping;
Язык программирования C# - Кислицын Д.И., 2017
61
62. Основы LINQ
LINQ to SQL (Определение контекста данных и моделей)using System.Data.Linq.Mapping;
namespace LINQtoSQL
{
Язык программирования C# - Кислицын Д.И., 2017
[Table(Name = "Заказ")]
public class Class1
{
[Column(Name = "Код", IsPrimaryKey = true,
IsDbGenerated = false)]
public string Id { get; set; }
[Column(Name = "Клиент")]
public string Client { get; set; }
[Column(Name = "Количество")]
public int Kol_vo { get; set; }
[Column(Name = "Товар")]
public string Tovar { get; set; }
[Column(Name = "Доставка")]
public bool Dostavka { get; set; }
[Column(Name = "Цена")]
public decimal Price { get; set; }
}
} 62
63. Основы LINQ
LINQ to SQL (Определение контекста данных и моделей)Атрибут [Column] имеет ряд свойств, с помощью которого можно настроить сопоставление
столбца:
• AutoSync: указывает, как надо извлекать значение столбца после вставки или обновления
• CanBeNull: указывает, может ли столбец принимать значение null
• DbType: определяет тип столбца. Указывается, если надо создать новую базу данных
• Expression: хранит выражение, которое будет использоваться для вычисления значения
свойства
• IsPrimaryKey: хранит логическое значение и указывает, выполняет ли столбец роль первичного
ключа (как в данном случае Id)
• IsDbGenerated: хранит логическое значение, которое указывает, будет ли значение столбца
генерироваться самой БД
• IsDiscriminator: указывает, будет ли столбец разграничителем в системе наследования классов
• IsVersion: указывает, будет ли столбец хранить номер версии строки или значение timestamp,
которое указывает на время последнего изменения строки
• Name: задает имя столбца, с которым будет сопоставляться данное свойство
• Storage: указывает на имя приватной переменной, которая будет хранить значение данного
столбца
• UpdateCheck: определяет, как LINQ to SQL будет решать проблему параллелизма. Если в модели
нет свойств со значение IsVersion=true, то операциях с данными БД будет сравнивать значения
строк из таблицы со новыми значениями
Язык программирования C# - Кислицын Д.И., 2017
63
64. Основы LINQ
LINQ to SQL (Определение контекста данных и моделей)class Program
{
static string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=11;Integrated Security=True";
private void button1_Click(object sender, EventArgs e)
{
DataContext db = new DataContext(connectionString);
// Получаем таблицу пользователей
Table<Class1> users = db.GetTable<Class1>();
foreach (var user in users)
{
textBox1.Text += user.Id+"\t"+ user.Client+"\t"+
user.Dostavka+"\t"+ user.Price+"\r\n";
}
}
}
Язык программирования C# - Кислицын Д.И., 2017
64
user.Kol_vo+"\t"+
user.Tovar+"\t"+
65. Основы LINQ
LINQtoSQL (Фильтрация и сортировка)class Program
{
static string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=11;Integrated
Security=True";
private void button2_Click(object sender, EventArgs e)
{
DataContext db = new DataContext(connectionString);
var query = db.GetTable<Class1>().Where(u => u.Price > 18).OrderBy(u => u.Tovar );
// или
// var query = from u in db.GetTable<Class1 >()
// where u.Price > 18
// orderby u.Tovar
// select u;
textBox1.Text = "";
foreach (var user in query)
{
textBox1.Text += user.Id + "\t" + user.Client + "\t" + user.Kol_vo + "\t" + user.Tovar + "\t" +
user.Dostavka + "\t" + user.Price + "\r\n";
}
SELECT *
}
FROM [Заказ] WHERE [Цена] > 18
}
ORDER BY [Товар]
Язык программирования C# - Кислицын Д.И., 2017
65
66. Основы LINQ
LINQtoSQL (Группировка)private void button3_Click(object sender, EventArgs e)
{
DataContext db = new DataContext(connectionString);
var query = db.GetTable<Class1 >().GroupBy(u => u.Price );
// или так
// var query = from u in db.GetTable<Class1 >()
// group u by u.Price // группировка по возрасту
// into grouped
// select grouped;
textBox1.Text = "";
foreach (var group in query)
{
textBox1.Text +="\r\nЦена: " + group.Key +"\r\n" ;
foreach (var user in group)
textBox1.Text +="\t"+user.Client ;
}
}
Язык программирования C# - Кислицын Д.И., 2017
66
67. Основы LINQ
LINQtoSQL (Изменение объектов)При получении объектов из базы данных в контекст DataContext эти объекты
кэшируются, и у них устанавливается состояние Unchanged. Если мы изменим значения
свойств какого-либо объекта из полученного набора, то DataContext для этого объекта
создает копию с измененными значениями и устанавливает у нее статус ToBeUpdated.
При вызове метода SubmitChanges() контекст данных сверяет значения
оригинального объекта и его измененной копии. И если два объекта отличаются, то
создается sql-выражение UPDATE, с помощью которого происходит обновление объекта
в базе данных.
Язык программирования C# - Кислицын Д.И., 2017
67
68. Основы LINQ
LINQtoSQL (Изменение объектов)private void button4_Click(object sender, EventArgs e)
{
DataContext db = new DataContext(connectionString);
textBox1.Text = "";
textBox1.Text +="До обновления\r\n";
foreach (var user in db.GetTable<Class1 >().Take(3))
{
textBox1.Text += "\r\n" + user.Client + "\t" + user.Tovar + "\t" + user.Price;
}
Class1 user1 = db.GetTable<Class1>().FirstOrDefault();
user1.Price = 50;
db.SubmitChanges(); // сохраним изменения
textBox1.Text +="\r\n После обновления\r\n";
foreach (var user in db.GetTable<Class1 >().Take(5))
{
textBox1.Text += "\r\n"+user.Client + "\t" + user.Tovar + "\t" + user.Price;
}
}
Язык программирования C# - Кислицын Д.И., 2017
68
69. Основы LINQ
LINQtoSQL (Добавление объектов)Чтобы добавить новый объект в базу данных, необходимо вызвать у
таблицы в контексте данных метод InsertOnSubmit() или InsertAllOnSubmit()
(если нужно добавить список объектов)
Если в базе данных значение какого-либо столбца, например, столбца для
Id, должно генерироваться автоматически, то в классе модели атрибут Colunm
над соответствующим свойством должен иметь значение IsDbGenerated = true
Язык программирования C# - Кислицын Д.И., 2017
69
70. Основы LINQ
LINQtoSQL (Добавление объектов)private void button5_Click(object sender, EventArgs e)
{
DataContext db = new DataContext(connectionString);
textBox1.Text ="До добавления";
foreach (var user in db.GetTable<Class1 >().OrderByDescending(u => u.Id))
{
textBox1.Text += "\r\n" + user.Client + "\t" + user.Tovar + "\t" + user.Price;
}
Class1 user1 = new Class1 {Id ="10101", Client = "Ronald", Kol_vo= 10, Dostavka = true , Tovar =
"Кирпич", Price = 34 };
db.GetTable<Class1 >().InsertOnSubmit(user1);
db.SubmitChanges();
textBox1.Text +="\r\nПосле добавления";
foreach (var user in db.GetTable<Class1 >().OrderByDescending(u => u.Id))
{
textBox1.Text += "\r\n" + user.Client + "\t" + user.Tovar + "\t" + user.Price;
}
}
Язык программирования C# - Кислицын Д.И., 2017
70
71. Основы LINQ
LINQtoSQL (Удаление объектов)Для удаления объекта из БД применяется метод DeleteOnSubmit() или
DeleteAllOnSubmit(), если удаляется список объектов
Язык программирования C# - Кислицын Д.И., 2017
71
72. Основы LINQ
LINQtoSQL (Удаление объектов)private void button6_Click(object sender, EventArgs e)
{
DataContext db = new DataContext(connectionString);
// получим последний объект для удаления
var user = db.GetTable<Class1 >().OrderByDescending(u => u.Id).FirstOrDefault();
textBox1.Text = "";
if (user != null)
{
textBox1.Text +="Удаляемый объект:";
textBox1.Text +="Id: "+ user.Id;
textBox1.Text +="Client: "+ user.Client ;
textBox1.Text +="Tovar: "+ user.Tovar ;
db.GetTable<Class1>().DeleteOnSubmit(user);
db.SubmitChanges();
textBox1.Text += "Объект удален";
}
}
Язык программирования C# - Кислицын Д.И., 2017
72
73. Основы LINQ
LINQtoSQL(Непосредственное выполнение кода sql в классе DataContext)
Метод ExecuteCommand() принимает выполняемое sql-выражение и список параметров
DataContext db = new DataContext(connectionString);
int modifedRowsNumber = db.ExecuteCommand("DELETE FROM Заказ WHERE Товар={0}", 'Кирпич');
textBox1.Text = "Обработано " + modifedRowsNumber + " строк";
Метод ExecuteQuery() принимает выполняемое sql-выражение и список параметров и
возвращает результат выполнения запроса SELECT:
DataContext db = new DataContext(connectionString);
IEnumerable<Class1> users = db.ExecuteQuery<Class1>("SELECT * FROM Заказ WHERE Цена>{0}", 15);
textBox1.Text = "";
foreach (var user in users)
textBox1.Text += user.Id + "\t" + user.Client + "\t" + user.Kol_vo + "\t" + user.Tovar + "\t" +
user.Dostavka + "\t" + user.Price + "\r\n";
Язык программирования C# - Кислицын Д.И., 2017
73
74. Решение квадратного уравнения
Техническое задание1. Написать класс для решения квадратного уравнения вида
ax2+bx+c=0.
Входные данные: a, b, c (тип double).
Выходные данные:
- решение уравнения (1 или 2 корня),
- проверка решения (максимальная из двух решений
величина ошибки),
- уведомление, если уравнение не имеет действительных
корней или не является квадратным.
2. Реализовать проверку входных данных и в случае ввода
данных в неверном формате (не число) сообщить об ошибке и
запросить данные повторно.
3. После вывода результатов решения уравнения запросить
пользователя ввод нового уравнения
или выход из программы.
Язык программирования C# - Кислицын Д.И., 2017
74
75. Решение квадратного уравнения
Примерная структура классакоэффициенты при неизвестных
0, 1, 2 (количество корней); 3 – «неквадратное уравнение»
«Действительных корней нет» / «Неквадратное уравнение»
содержат решения или сообщения об ошибках
вычисление дискриминанта
конструктор, определяющий er и err
вычисление максимального
отклонения в решении
Язык программирования C# - Кислицын Д.И., 2017
75
76. Игра «Тир»
Язык программирования C# - Кислицын Д.И., 201776
77. Крестики-нолики
Label [,] lbs;private void button1_Click(object sender, EventArgs e)
{
lbs = new Label [n,n];
for (i = 0; i < n; i++)
for ( j = 0; j < n; j++)
{
Label lb=new Label();
lb.Location = new System.Drawing.Point(50 + i * 25, 50 + j * 25);
lb.Name = "lb" + i.ToString() + j.ToString();
lb.Size = new System.Drawing.Size(25, 25);
lb.Text = "[ ]";
lb.Click += new System.EventHandler(lb_Click);
Controls.Add(lb);
lbs[i,j]=lb;
}
}
void lb_Click(object sender, EventArgs e)
{
Label lb = (Label )sender;
lb.text=“X”;
Язык программирования C# - Кислицын Д.И., 2017
77
}