Русскоязычный видео курс по основам языка C# и технологиям .NET. Рассматриваются теоретические основы и их практическое применение на примере создания
Windows Forms приложений
Использование технологий ADO.NET
при работе с XML и TXT на C#.
Смешанный режим взаимодействия с
SQL-Server, работа с форматом .txt, .xml, реализация инкапсуляции на
пределе возможностей свойств и много-многое другое.
Основы языка C# и платформы .NET.
70 видеоуроков по теории и о том,
как профессионально создавать и развёртывать
windows-приложения.
Любое нормальное приложение использует базы данных. Но не всегда есть смысл использовать мощнейшие SQL-сервера. Бывают случаи, когда целесообразней развернуть БД в формате xml. Более того, любой хостинг работает с txt-форматом (на пример ведение логов сервера).
"А покажите мне сайт, не использующий БД", спросите Вы. И я Вам покажу... этот сайт. Вы сейчас на нем находитесь. Мне проще и быстрее работать с xml и txt - файлами, поскольку информация в них лишь заносится при необходимости, но не считывается для отображения в качестве контента.
Но главное, сериализация объектов выполняется в ходовой формат xml и очень легко
передается по сети

Серия видеокурсов по технологии .NET и языку C#.
Часть II.
ADO.NET и основы SQL запросов
Часть I. WindowsForm
Часть II. ADO.NET и основы SQL запросов
http://skillcoding.com
Вы прошли первый диск второй части части. Материала оказалось много. Но,
особо интересующиеся желают также овладеть навыками по работе с директориями и
файлами, по работе с форматом xml для использования всего этого при создании
альтернативных мобильных БД и иной локальной работе.
Я более не стану так подробно расписывать все нюансы, думаю Вы уже и так можете
предугадать, что именно я представляю в этом курсе и в каком качестве.
Поэтому сразу перейду к краткому описанию видеоуроков данного дополнения.
Итак, дополнение ко второй части видеокурса
ПРОФЕССИОНАЛЬНАЯ ПОДГОТОВКА РАЗРАБОТЧИКА
по языку C# на платформе .NET.
Часть
2 А XML/TXT в аспекте ADO.NET
Курс посвящен практическому использованию различных режимов использования
форматов xml и txt при разработке приложений с локальными, легко переносимыми
БД, а также практическим навыкам построения наиболее грамотно построенного
приложения на основе соблюдения максимальной инкапсуляуии свойств, добиваясь
повышения читабельности кода, многократного уменьшения объема кода,
значительного упрощения процесса внесения изменений в имеющийся код и, главное,
масштабной экономии ресурсов машины, на которой запущено данное приложение.
Недельный курс на 70 уроков посвящен завершающей фазе подготовки разработчика
перед принятием на изучение веб-технологий на базе ASP.NET/AJAX.
Основной упор сделан на "натаскивание" ученика на создавать простой и эффективной
архитектуры приложения (второй проект).
Пожалуйста,
внимательно ознакомьтесь с содержанием каждого урока.
ПРОФЕССИОНАЛЬНАЯ ПОДГОТОВКА РАЗРАБОТЧИКА
по языку C# на платформе .NET.
Часть
2 А: "XML/TXT в аспекте ADO.NET"
На
второй диск второй части курса вошло почти 70 видеоуроков.
Главное меню.
Что есть на диске?
1. 70 уроков в формате экранного видео.
2. Исходные коды проектов и их локальные и серверные
БД.
3. Дополнительные сопутствующие файлы.

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



Работа в формате xml, txt
Проект "Birthday"
Меню раздела 1.
Урок 1
- Знакомство с проектом
- Разбор контролов формы
- TabPage - устройство и принцып работы
- TabControl - устройство и принцып работы
- SplitContainer - устройство и принцып работы
- ListBox - устройство и принцып работы
- MaskedTextBox - устройство и принцып работы
- 8RichTextBox - устройство и принцып работы
- Dock in paren container
- Как мы создадим базу данных без SQL-Server
- Альтернатива SQL - XML
- Создаем xml БД проекта
- Формируем структуру xml-файла БД
- Определяемся с требуемыми тегами
- Вносим первые тест-данные в БД
Урок 2
- Создаем класс для инкапсуляции состояния персоны
- Формируем класс требуемыми полями и свойствами
- Создаем перегрузку конструктора
- Создаем конструктор по умолчанию
Урок 3
- Разбираемся с плюсами и минусами разрабатываемого нами проекта
- UI, BLL, DAL - что оставить для реализации?
- Определяемся с уровнями BLL, DAL
- Скольки n-звенная архитектура оправдана для реализации в данном приложении?
- Создаем класс DataLayer
- Вопросы клиента и сервера
- Забиваем настройки соединения с БД в конфигурационный файл приложения app.config
- ConfigurationManager и ConfigurationSettings
- Формат задания пути к файлу БД
- Зачем дополнительную информацию мы будем зранить в файлах .txt - что б научиться работать с файловой системой с c#
- Первые записи в классе DataLayer по получению дескриптора доступа к БД и дополнительным текстовым файлам
- Определение способа заполнения ListBox-ов
- Создание метода для получения из БД имен всех персон
- Первые соображения по работе с байт-потоком файла xml
- Тип FileStream для доступа к файлу из пространства имен System.IO
- FileMode, FileAccess, FileShare
- Создание объекта типа System.Xml.XmlDocument
- Метод XmlDocument.Load
- Подведение итогов первых шагов
Урок 4
- Реализовываем метод GetPeopleName
- Описание логики прохождения по тегам фала xml
- Старый добрый for
- XmlDocument.DocumentElement.ChildeNodes
- Свойство FirstChilde - отличнейшее средство начала навигации по структуре xml документа!
- Свойство InnerText
- Свойство NextSibling
- Загружаем полученные данные в контрол ListBox
- Определяемся с уровнем, в котором будем выполнять сортировку выбранных из БД записей
- Array.Sort
- Добавляем в ListBox нумерацию записей
Урок 5
- Обнаруживаем реальную проблему доступа к тегам xml файла при теперешнем подходе поиска узлов
- Правильный поиск требуемых тегов путем проверки свойства Name
- Еще более улучшаем логику поиска требуемых тегов
Урок 6
- Создание дополнительного Dictionary в классе Man
- Реализация конструктора без параметров класса Man
- Изменение аксессора у полей данного типа
Урок 7
- DAL метод для получения полной информации о конкретной персоне
- Непосредственная загрузка данных в XMLDocument из файла напрямую
- Работаем с объектом типа XmlNode
- Определяемся с условием поиска и выбора требуемой ветки персоны в xml-файле
- Супер-метод SelectSingleNode. Настройка фильтров для параметра метода
- Синтаксис составления условий поиска/выборки требуемых узлов в Xml-документе
- Зачем мы выбираем полную ветку персоны
- Список внутренних тегов внешней родительской ветки, помещенных в объект типа XmlNodeList - свойство ChildeNodes
- Заполнение Dictionary деталями требуемой персоны
Урок 8
- Разбор процедуры определения имени и фамилии для искомой в БД персоны
- Распарсировка значения элемента ListBox
- Создаем дополнительный partial класс StartForm
- Разработка метода вытягивания имени и фамилии персоны из элемента ListBox
- Опускаем пока регулярные выражения на будущее, а пока выбираем более простой для понимания и более длительный способ для реализации задуманного
- Очень интересный цикл while для "порезки" строки
- Подводим итоги полученного массива
Урок 9
- Создаем еще паршиал класс для событий
- Событие SelectedIndexChanged
- Заполнение текстовых полей, находящихся в нескольких иерархических родительских/дочерних внешних контролов
- Определение способа поиска и доступа к текстовым полям MaskedTextBox на форме
- Получаем родительский контрол, содержащий ListBox с помощью свойства Control.Parent
- Получаем SplitContainer из SplitterPanel методом GetContainerControl
- Получаем второй SplitterPanel из SplitContainer свойством Panel2
- Вытягиваем все RichTextBox из полученной SplitterPanel
Урок 10
- Вылавливаем ошбку исполнения
- Почему происходит неверное отображение некоторых данных в отдельных MaskedTextBox
- Анализируем требуемые маски ввода для нескольких MaskedTextBox
Урок 11
- Выносим логику заполнения первого ListBox во внешний метод
- Переписываем данный метод на универсальное заполнение всех ListBox формы
- Понимаем проблему ручной настройки внешнего вида всех контролов формы
- Создаем рекурсивный метод для нахождения (поиска) всех дочерних контролов требуемого типа в родительском контроле
- Определяем требуемые входные параметры для метода
- Используем полученную рекурсию для поиска всех MakedTextBox формы
- Используем полученную рекурсию для поиска всех Label формы
Урок 12
- Анализируем достоинства и недостатки предыдущего кода получения имени и фамилии персон в БД xml
- Метод SelectSingleNode и xPath-выражения
- Правила формирования xPath-запросов для навигации по XML-документу
- Получаем универсальный поиск требуемых узлов xml не зависимо от их местонахождения в родительском узле
- Особенности работы метода SelectSingleNode
- Метод SelectNodes
Урок 13
- Анализируем типы имеющихся тегов в структуре xml-документа
- Видоизменяем некоторые парные теги на самозакрывающиеся. Зачем это сделано и для каких тегов
- Загоняем всю информационную нагрузку в атрибуты тегов
- XmlTextReader - тип для скоростного чтения огромных xml-документов
- Чтение узлов xml-разметки без полной загрузки в оперативную память всего документа
- Свойство WhiteSpaceHandling
- Получение объектом XmlTextReader типа узла XmlNodeType
- Метод GetAttribute для получения значения атрибута тега
Урок 14
- Язык запросов XPath и классы-обертки для работы с xml
- Изменяем метод GetManDetails на использование классов XPath
- Пространство имен XPath
- Объекты XPathDocument
- Класс XPathNavigator
- Метод CreateNavigator
- Итератор XPathNodeIterator - для чего он нам нужен
- Метод Select с предикатом выборки. Формат формирования условий выборки
- Перемещаемся к первому элементу итератора - MoveNext метод
- Использование дополнительного внутреннего итератора XPathNodeIterator
- Current.SelectChildren
- Узел-от-узла отделяется слешем
- Все узлы - два слеша
- Ключевые слова объединения условий AND и OR
- Символ * для идентификации любого тега
- Поиск по атрибутам с помощью символа @
Урок 15
- Меняем структуру xml-файла для работы с атрибутами повторяющихся узлов
- Свойство Attributes[].Value
- Выборка из всех узлов Man значения атрибутов имени и фамилии
- Выборка значений всех атрибутов вложенных тегов одного конкретного внешнего узла
- Составляем предикат для выборки по атрибутам
- Метод GetAttribute
- Подведение итогов по доступным инструментам для работы с xml-разметкой
Урок 16, 17
- Добиваемся данамического заполнения TextBox на всех вкладках, зачем это?
- Подписываемся на событие SelectedIndexChenged для всех текстбоксов одним обработчиком
- Меняем цвет текста во всех MaskedTextBox одной маленькой записью
- Поиск возможного присутствия некоторой персоны в xml-БД
- Опять применяем оператор using для освобождения ресурсов чтения xml-файла
- Зачем вызывать метод Close в блоке using
- Добавляем новые ветки узлов в разметку xml-документа
- Создание объектов XmlElement
- Метод XmlDocument.CreateElement
- Проводим итератор по Dictionary обычным способом, используя тип KeyValuePair
- Процедура создания нового тега
- Заносим значение в тег через свойство InnerText
- XmlElement.AppendChilde - закрытие дочерних тегов
- InsertAfter - закрытие главного узла
- Необходимость указания последнего дочернего узла во внешнем родительском элементе-теге
- FileMode.Trancate - FileStream на запись данных в файл
- Сохраняем все данные методом Save.
Урок 18
- Разработка метода поиска существующей персоны
- Отказ от стандартной процедуры поиска и сравнения значений элементов узлов xml-разметки
- Почему если возникает ошибка при загрузке xml-документа, мы считаем, что искомая персона имеется в БД
- Метод GetElementsByTagName
- Условие совпадения на равенство двух персон
Урок 19, 20
- Разработка метода для создания новой персоны
- Получаем список необходимых TextBox
- Почему мы решаем кодить "не правильно"?
- Получаем сколлекцию конролов List<Control>
- Ищем все требуемые котролы в текущей вкладке TabControl.SelectedTab
- Используем тип IEnumerator и KeyValuePair для альтернативного инумератора по коллекции Dictionary
- Понимаем запись: for(IEnumerator<KeyValuePair<K, V>> en = Object.GetEnumerator(); en.MoveNext();) {en.Current;}
- Разбираем принцип работы IEnumerator
- Исключение "Коллекция была изменена..."
- Меняем объект Dictionary используя открытые свойства класса
- Тестируем работу приложения для обнаружения ошибок
Урок 21
- Находим и исправляем досадную и ламерскую ошибку в логике поиска требуемой информации в дереве xml
- GetElementByTagName - метод непосредственного доступа к требуемым тегам по имени тега
- Используем коллекцию XmlNodeList
Урок 22
- Реализация метода уровня DAL удаления персон
- Ничего нет проще чем удаление узла в xml
- Получение корня xml-документа посредством свойства DocumentElement
- Получение единственного узла методом SelectSingleNode
- Создаем предикат для метода поиска узла
- Интересный стринговый запрос для выборки требуемого элемента
- Переход на одну ступень выше по иерархии узлов
- Получаем родительский тег для данного через свойство ParentNode
- Удаляем ветку методом RemoveChild
Урок 23, 24
- Реализация мастера по процессу удаления персоны
- Необходимость реализации дотошных окон с вопросами подтверждения удаления
- Еще один вариант поиска требуемых дочерних контролов в родительском
- Использование индексатора-свойства Controls[] для получения списка дочерних контролов
- Отказываемся от только что проработанного кода получения любого контрола в родительском, почему?
- Долгий и мучительный процес ручной установки значений всех свойств объекта персоны
- Вылавливаем ошибку удаления персоны на уровне DAL
- Exception - данный ключ отсутствует в словаре
Урок 25
- Редактирование существующей персоны
- Создание рекурсивного метода, возвращающего один единственный контрол в родительском
- Определяемся с входными параметрами метода
- Реализуем известную рекурсию с небольшой поправкой на возвращение одного контрола
Урок 26
- Создание метода редактирования персоны на уровне DAL
- Определяемся с входными параметрами метода. Выбор типов параметрам
- Анализируем сложившуюся ситуацию с оригинальными данными и предлагаемыми (original/proposed) данными данной персоны
- XmlDocument.Load
- Получаем корень xml документа XmlDocument.DocumentElement
- Ищем узел. Формируем предикат выражения выборки
- XmlNodeList и свойство Метод Item(i)
- Свойства InnerText и Name
- Сохранение файла через FileStream, FileMode.Truncate
Урок 27
- Выясняем скрытую проблему при обновлении значения тега xml-документа персоны
- Дорабатываем метод обновления персоны
- Добавляем логику сохранения и последующего получения original данных обновляемой персоны
- Причины возможной "тупости" при создании кода
- Исправление последних недочетов в методе сохранения изменений в персоне
Урок 28
- Анали требований для управления доступностью кнопок на форме в зависимости от выбранной текущей вкладки TabPage данного TabControl
- Выбор алгоритма управления доступностью кнопок формы.
- Создаем перечисление enum TabMode
- Реализовываем метод управления кнопками
- Событие TabControl.SelectedIndexChanged
- Используем свойство SelectedIndex для параметризированного вызова метода управления кнопками
Урок 29
- Подтягиваем функционал по сбросу значений в MaskedTextBox текущей персоны
- Опять юзаем метод получения искомого дочернего контрола в родительском
- Получив все требуемые контролы, сбрасываем их текстовые значения
Урок 30
- Урок для расширения кругозора
- Создаем обобщенный метод поиска дочернего контрола
- private<T> GetChildeControl(Control outerControl) where T : Control
- Переписываем предыдущий метод, всего лишь изменив тип на T
- Немного слов по использованию ключевого слова var для нестрогой типизации переменной-ссылки
- Большое преимущество обобщенного метода в отсутствии необходимости приведения типов при поиске дочернего элемента
Урок 31
- Подписываемся на событие ListBox.Click одним махом все ListBox
- ListBox.OnPaint - проблемы перерисовки контрола
- Методы остановки процесса перерисовки контрола BeginUpdate и возобновления EndUpdate
- Первый вариант реверса - загоняем в массив и используем метод Array.Reverse
- Используем коллекцию List для заполнения именами персон
- ListBox.Items.Clear
- Недостатки и издержки данного подхода по реверсу элементов в ListBox
- Другой более верный вариант реверса списка
- Из коллекции ListBox.Items удаляем зеркалные элементы элементы в контроле и меняем их местами
- Метод ListBox.Items.RemoveAt
- Метод ListBox.Items.Insert
- ArgumentOutOfRangeException - нежданное исключение
- Выясняем ламерскую и не уловимую сразу причину возникновения исключения
Урок 32, 33
- Обнаруживаем досадную ошибку из предыдущего урока
- Выявляем еще один щепитильный момент
- 10000 созданий больших объектов
- Исправляем недочеты
- Переносим ответственность сортировки ListBox с него самого на дополнительную кнопку Button
- Получаем текущий ListBox из активной вкладки TabControl.SelectedTab
- Разбираем вопрос получения дополнительной информации из текстовых файлов .txt
- Определяемся с именными папками и файлами каждой персоны
- Вариант идентификации файла для конкретной персоны
- Уникальный идентификатор - обход ограничения его отсутствия
- Выбираем идею именования директорий и файлов в них, относящихся к конкретной персоне
- Расширяем функциональность метода GetManDetails
- Получение объекта типа StreamReader - потоковое чтение данных с файла
- Формируем путь к целевому файлу
- В цикле while построчно считываем информацию с файла - метод ReadLine
- Как проверить факт достижения ридером конца файла
- StreamReader.Dispose
- GileNotFoundException и DirectoryNotFoundException
- Получаем контрол RichTextBox
- OutOfMemoryException
- Как избежать потенциальной вероятности возникновения ексепшенов
- Directory.Exists - метод проверки существования директории
Урок 34
- Создание директории, файла и запись текста в файл
- StreamWriter для записи текста в формате txt
- DirectoryInfo - дескриптор для работы с директориями
- Получаем значение RichTextBox для помещения в метод StreamWriter.Write записи данных в файл .txt
- Проверяем работу метода по редактированию персоны с проверкой создания и редактирования привязанного файла .txt на примере Константина Ёпрста
Урок 35
- Разбрасываем общие куски кода и оформляем в отдельные методы
- Почему при попытке редактирования текстового файла с описанием персоны мы получаем сообщение о невозможности проведения данной операции
- Поиск неоднозначности в коде
- Вносим малюсенькое изменение в метод обновления персоны и получаем правильно работающий код
- Проверка работы метода
Урок 36, 37
- Анализ способа идентификации персоны и сопоставления ей txt-файла с описанием
- Моделирование стандартных вариантов развития ситуации
- Как же найти текстовый файл с описанием для измененной персоны
- Понимание реальной проблемы соответствия текстового файла с описанием персоны её ветке в xml файле
- Проверка условия на необходимость замены текстового файла
- Удаление папки методом Directory.Delete
- Удаляем рекурсивно все внутренние папки и файлы в удаляемой
- Гоняем приложение на обновление персоны в различных режимах для выявления существующих багов
- Дотачиваем метод удаления персоны функционалом по удалению директории персоны. Метод Directory.Delete
- Метод обнаружения директории Directory.Exists
- Забыли пометить метод на удаление папки рекурсивно
Урок 38
- Анализ способа доступа к файлам с описанием персон со стороны третьих лиц
- Необходимсть отслеживания фактов любого типа доступа и взаимодествия с файлами txt нашего приложения третьими лицами
- Как работает модуль опроса состояния файлов приложения
- Класс FileSystemWatcher
- Установка свойства NotifyFylter, EnableRaisingEvents
- Подписка на событие FileSystemWatcher.Changed, FileSystemWatcher.Created, FileSystemWatcher.Deleted
- Проблема кросспоточного вызова пользовательского метода из обработчика события FileSystemWatche
- Создаем делегат для возможности вызова целевого метода при вызове потокового метода invoke
- Проверяем работу объекта FileSystemWatcher
Урок 39
- Другая альтернатива записи данных в файл - добавление данных в конец файла без оьщей перезаписи
- FileMode.Truncate и FileMode.Append - отличия в работе
- Сворачивание приложения в трей
- Контрол NotifyIcon. Заносим в ресурсы иконку
- Необходимость подписки на событие NotifyIcon.DoubleClick
- Установка свойства WindowState
- Событие Resize и метод Hide
- ContextMenuStrip - настройка элементов на раскрытие, сворачивание, закрытие окна приложения
Урок 40
- Получение объекта типа StreamReader не через конструктор класса
- Тип File и метод Open, OpenText для открытия текстового файла
- Другой вариант разбиения строки по пробелам - один единственный метод string.Split перегруженный
Урок 41
- Обобщение имеющихся знаний по работе с файлами
- Повтор и анализ существующего метода реверса ListBox
- Альтернативный вариант (более правильный) реализации реверса списка на основе взаимозамены элементов ListBox
- ListBox.Items.RemoveAt и ListBox.Items.InsertAt методы
- Опять возможная ошибка при перестановке элементов Items в ListBox
- Проблема доступа к последнему элементу
- Быстрая однострочная загрузка списка List<T> с помощью метода File.ReadAllLines
- File.CreateText метод
Урок 41
- Подписываем одним махом все MaskedTextBox на события Click и Leave для манипулирования свойствами BackGroundColor
- Реализовываем проеврку с запретом добавления новой персоны если такая уже имеется в ListBox
- Выполняем проверку по имени и фамилии на стадии внесения значений для имени и/или фамилии
- Дополнительно подписываем готовые MaskedTextBox на те же события, на окторые уже однажды подписаны - зачем это?
- Определение условий для проверки значений имени и фамилии
- Выделяем в ListBox найденный элемент и деактивируем кнопку управления
Урок 42
- Создание в DataLayer метода получения списка персон, у которых скоро предвидется День рождения
- Получение текущего месяца методом ToString
- XmlNodeList.SelectNodes(string.Format - опять создаем предикат Xpath для выборки/поиска требуемых узлов Man
- Ключевое слово substring в предикате для поиска части даты, сравнение даты с текущей
- Принципы работы с форматом Date в Xpath запросах к разметке xml
- Другой способ получения не всей ветки Man, а конкретно дочерний узел даты рождения
- Ключевое слово Text() для доступа в запросе Xpath к активному содержимому xml-тега
- Несколько вопросов практического применения .NET-типов и их псевдонимов в c#
- Индексатор NodeList для доступа к внутренним тегам текущего узла
Урок 43
- Выводим на клиенте результаты поиска в DAL
- Проверяем правильность работы приложения по выводу персон у которых в скором времени День рождения
- Создаем метод для поиска и вывода текущих именинников
- Отладка кода и проверка на запущенном приложении
Урок 44, 45
- Реализация автозапуска приложения при загрузке ОС
- Добавляем на форму кнопки для добавления/удаления записей в реестре Windows под автоматический запуск нашего приложения
- Пространство имен Microsoft.Win32
- Использование типа RegistryKey и LocalMachine.OpenSubKey для работы с реестром
- RegistryKey.SetValue для установки значения в ветку реестра
- Application.ExecutablePath
- RegistryKey.GetValue и RegistryKey.DeleteValue
- Автозагрузка приложения вступает в силу только после перзагрузки Windows
- Позволяем пользователю выбрать вариант перезагрузки ОС
- Создаем метод по перезагрузке Windows
- Пространство имен System.Diagnostics
- Класс Process. Создание объекта для использования командной строки
- Посылание команды
- Process.StartInfo - установка требуемой информации. Синтаксис указания аргументов командной строки запускаемого процесса
- Process.Start для запуска операции
- Другой вариант запуска процесса (приложения, команды) - ProcessStartInfo
- Еще один вариант в одну строку
Урок 44, 45
- cmd.exe
- Перебор массива входных аргументов метода Main
- Задание стра-параметров для проекта через вкладку Properties
- Другой вариант запуска приложения через внешнюю команду
- Создаем файл Start.txt, создаем из него файл Start.bat и вносим в него команду запуска нашего приложения с дополнителными аргументами
- Выполняем батник
- Изменяем аргументы в команде батника и опять запускаем батник - наблюдаем отличия.
- Ручной запуск приложения инструкцией в командной строке
ADO.NET
(смешанный режим)
Проект "Школьный журнал"
Меню раздела 2.
Урок 1
- Пример работы разрабатываемого приложения
- Разбор функциональности приложения
- Разбор взаимосвязей между контролами формы
- Процесс отображения серии оценок для учеников данного класса, по данному предмету в данный месяц текущего года
- Процесс выставления ученику оценки
- Подсвечивание значения оценки в ячейке DataGridView
- sql-запрос, получающий одну единственную результирующую таблицу на основе нескольких таблиц
- Смешанный режим в работе с ADO.NET
- Понимание важности выбора способа взаимодействия с БД на тех, илииных этапах в работе приложения
- Анализ структуры БД School
- Отношение многие-ко-многим
- Оценки - отдельная таблица. Анализ внешних связей для таблицы оценок
Урок 2, 3
- Создание нового проекта WindowsForms
- Создание пространства имен для типов Common
- Анализ схемы БД для определения необходимых для создания Common-классов
- Определяемся что есть общего у каждой таблицы. Создаем абстрактный базовый класс
- Реализовываем public abstract class SchoolItem
- Определяем поля и свойства, выбор модификатора доступа protected
- Почему внутри класса мы определяем закрытые свойства
- Создаем классы-наследники Subject, Class, People, Teacher и класс Mark
Урок 4
Урок 5
- Создание уровня взаимодействия с БД
- DataAccessLayer класс
- Добавление в Settings проекта строки соединения ConnectionString
- Создаем закрытое свойство для получения ConnectionString
- Почему строку соединения мы загнали в свойство?
- Свойство только для чтения
- Какие выгоды приносят нам использование свойств для получения тех, или иных объектов типов .NET?
- Анализ типа работы приложения классного журнала, разбор качества и частоты взаимодействия с сервером
- Создаем единственный объект SqlConnection и, получая его через свойство, используем его в разных участках программы
- Первое обращение к свойству. Повторные обращения к свойству. Что порисходит и что подвергается экономии. Скорость работы приложения
- Экономия ресурсов управляемой кучи
- Создаем форму авторизации учителей
- Проверяем загрузку формы при старте приложения
Урок 6
- Принципы построения смешанного режима в работе с ADO.NET
- Получение DataSet (DataTable) с помощью адаптера, а изменение данных в БД - с помощью отдельных команд
- Создание SqlDataAdapter для получения всех учителей
- Создание свойства для адаптера
- Выбор между метом и свойством для получения всех учителей из БД
- Разрабатываем открытое свойство, возвращающее список всех учителей
Урок 7
- Привязываем ListBox на свойство списка учителей
- Почему DefaultView.Sort() не подходит для сортировки нашего ListBox
- Создаем DataView из действующего свойства DAL.AllTeachers
- DataViewRowState.Original
- Иправляем возможное появление exception в блоке get свойства всех учителей
- Заставляем TextBox сбрасывать свой текст при попытке внесения данных
Урок 8
- Процедура авторизации учителя
- Выносим безсылочный объект DataTable с записями учителей на уровень класса для последующего поиска на клиенте логируемого учителя
- Реализовываем первый вариант проверки логина и пароля учителя
- Создаем объект дочерней формы с передачей в конструктор объекта Teacher залогиненного учителя
Урок 9
- Необходимость автоматической загрузки ListBox записями по предметам, которые читает данный учитель
- Устанавливаем Label и DateTimePicker в соответствующие значения
- Почему список предметов мы можем получить методом, но не свойством?
- Создаем свойство для доступа к уровню DAL
- Создание метода получения всех предметов, которые назначены данному учителю
- Выполняем сотртировку списка List<Subject>
Урок 10
- Анализ количества возможных вызовов за все время работы приложения метода получения всех предметов для данного учителя. Проанализировав это определяемся с типом взаимодействия с БД
- Определяемся также с моделью получения данных из БД
- Необходимые объекты SqlCommand и SqlConnection
- Создание свойства SqlCommand на выборку предметов
- Настраиваем требуемые параметры объекта-комманды
- Забиваем шаблон для объекта-параметра SqlParameter данной команды
- Как же устанавливать значение Value для входного параметра команды в свойстве объекта-команды
- Реализовываем коротенький метод получения списков предмета для заданного учителя
- Почему для открытого соединения мы не вызываем метод Dispose, а используем обычный Close?
- Наполняем список List<Subject> объектами предметов
- Тестируем работу приложения
- Еще раз оцениваем выгоды и преимущества от использования свойств для объектов SqlCommand, SqlDataAdapter, SqlParameter и т.д.
Урок 11
- Создание метода для получения всех классов, в которых читается данный предмет
- Составной запрос к БД для получения id доступных классов
- Создаем закрытое свойство для доступа к постоянному SqlDataAdapter получения требуемых классов
- Продолжаем строить высокоорганизованный код
Урок 12
- Реализовываем событие SelectedIndexChanged для ListBox предметов
- Анализируем реальную модель частоты получения списка классов для данного предмета
- Отдаем предпочтение на получение списка классов соответствующему свойству, а не методу
- Реализация свойства, возвращающее объект DataTable всех классов для текущего предмета
- Преимущества данного свойства при возможном апдейте будущего кода
- Необходимость выбора между скоростью работы приложения и экономией ресурсов машины
Урок 13
- Знакомство с текстом запроса хранимой процедуры для получения оценок оп данному предиету для данного класса в данный месяц требуемого года
- Выборка из 5 таблиц БД записей в один объект DataTable с помощью оператора Pivot и Join
- Выбор модели для получения на клиент результатов вызова хранимой процедуры
- Разработка свойства SqlDataAdapter для адаптера получения оценок
- Установка и настройка необходимых 4-х входных параметров для хранимой процедуры
Урок 14
- Разработка метода уровня DAL для получения требуемых оценок заданного диапазона дат по предмету для учеников класса
- Настраиваем значение свойства Value для всех 4-х параметров команды адаптера
- Заполняем таблицу банальным методом Fill
Урок 15
- Разработка обработчика события нажатия по кнопке отображения журнала
- Негласные правила создания методов, придерживаться которых все же следует
- Реализация закрытого свойства для предоставления названия текущего выбранного в ListBox элемента предмета
- Добавление кода предотвращения появления возможного исключения
- Реализация закрытого свойства для получения текущего класса. Отличие в доступе к требуцемым данным в этих двух свойствах. Вопрос в типе DataSource
- Выносим таблицу оценок на уровень класса, причины сего
- Приведение к типу DataRowView и прямое приведение к Subject
- Проверка работы методов.
Урок 16
- Необходимость выставления оценок преподавателем
- Выбор способа выставления оценок
- Определение с моментом передачи оценки на уровень DAL для занесения её в БД SQL-Server
- Фиксируем скроллинг первой колонки журнала и устанавливаем одинаковую ширину остальным прокручиваемым столбцам DataGridView
- Создаем внутренний метод для настройки внешнего ивда DataGridView
- Раскрашиваем оценки в зависимости от их значения
- Выделяем весь столбец по текущей дате и активной дате в DateTimePicker
- DataGridViewColumn - перебор столбцов грида, свойство DataGridViewTriState
- DataGridView.TopLeftHeaderCell
- DefaultCellStyle для настройки доступных свойств ячейки
- Проверяем работу метода настройки внешнего вида DataGridView
Урок 17
- Повышение удобства пользования пользовательским интерфейсом учителем, а также предотвращение возможных казусов выставления оценок не тем ученикам
- Выполняем управление доступностью кпопки вывода классного журнала в DataGridView
- Создаем один обработчик события для двух контролов: DateTimePicker и ListBox
Урок 18
- Процесс сохранения новых оценок
- Может ли преподаватель выставлять оценки "задним" числом/"передним" числом. Если да, то как?
- Может ли преподаватель редактировать имеющуюся оценку. Если да, то как?
- DAL - размышляем над процессом занесения новой оценки в БД
- Connected model - лучший выбор при обратной связи с Sql-Server
- Необходимость мгновенного сохранения в БД вновь выставленной оценки
- В какой момент следует сохранять оценку
- Менее ресурсоемкая коннектед модель над дисконнектед можелью
- Создаем закрытое свойство SqlCommand для инкапсуляции команды Insert и настраиваем требуемые входные параметры
- Исправляем допущенные ляпы
Урок 19
- Приступаем к разработке самого метода сохранения оценки в БД сервера
- Определяемся с типом входного аргумента
- Устанавливаем значения входных парамтров команды
- Еще три строчки кода по выполнению команды Sql-сервером
- Метод занесения оценки в БД уровня DAL простой, что же сложного в его использовании и о чем необходимо позаботиться для правильного вызова его?
Урок 20
- Несколько слов о событиях CellEndEdit и CellBeginEdit
- Запрещаем редактирование оценки
- Жестко и мгновенно контролируем (без участия пользователя) процесс занесения новой оценки на предмет внесения валидного значения
- CellBeginEdit - лучший момент для запрещения редактирования оценки
- CellEndEdit - прекрассный момент для скорейшей незаметной проверки значения вводимой оценки и предотвращение занесения невалидных значений в ячейке DataGridView
- Еще раз несколько слов по поводу процесса сохранения оценки в БД с точки зрения конечного пользователя - учителя - максимум удобств, быстродействия и простоты выполнения (автоматически без необходимости дополнительных манипуляций)
- Необходимость вызова методов DataGridView.EndEdit и DataTable.Rows[e.RowIndex].EndEdit - в чем соль?
- DataGridView.CirrentCell.Value для получения предлагаемого значения оценки в редактируемой ячейке грида
- DataRowVersion.Original для отката изменений в случае занесения невалидной оценки
- Проверка работы клиента
Урок 21
- DataRowState.Modified - ключевой момент в надобности сохранения оценки
- Вводим свойство CurrentPeopleID, CurrentSubjectID, MarkDate
- Создаем новый объект Mark
- DataTable.AcceptChanges - зачем нам его вызывать и, главное, в какой момент следует его вызывать
Урок 22
- Создаем свойство для получения уникального идентификатора для текущего предмета
- Создаем свойство для получения уникального идентификатора для текущего класса
- Создаем свойство для получения даты за которую проставляется оценка
- Вытягиваем го и месяц из DateTimePicker, а день месяца - из (один из вариантов) DataGridView.Columns[DataGridView.CurrentCell.ColumnIndex].HeaderText
- Вариант одновременного получения уникального идентификатора ученика и альтернатива нового запроса к БД
- Реализовываем свойство CurrentPeopleID, запрашивающее БД SQL-Server
- Анализ имеющихся данных на момент запроса id ученика из БД
- Получение имени ученика из DataGridView
Урок 23, 24
- Предварительные соображения по организации метода уровня DAL для получения id ученика
- Создаем свойство SqlCommand для инкапсуляции объекта-команды получения id ученика
- Настраиваем и добавляем требуемые параметры SqlParameter
- "Работаем" над методом получения id ученика
- Устанавливаем значения Value для параметров
- Лучше применять ExecuteScalar в нашем случае
- Проверяем успешную работу всей системы
- Необходимость "перераскрашивания" оценок после добавления новой оценки
- Несколько слов по расширению функциональности данного приложения
- Понимание "замены одного винтика не требует знания всей модели автомобиля" и "каждый дилетант должен смочь быстро заменить деталь не разрушив работу всей системы" - главные задачи построения читабельного, прозрачного, структурированного, иерархического кода. Чем мы и занимались в данном проекте :)
- Понимаем всю мощь и выгоды использования свойств для инкапсуляции/скрытия кусков кода
Урок 25
- Подводим итоги по пройденному материалами
- Работу с графическими файлами мы поработаем в курсе по ASP.NET на анализе, проверке, изменения размеров и т.д. загружаемых пользователями графики на сервер
- Если мы хотим редактировать оценку - требуемые изменения
- Необходимость выбора метода для сохранения/редактирования оценки на уровне DAL
- Необходимость создания дополнительного свойства для класса Mark
- По данному свойству можем выбирать способ занесения/редактирования оценки на сервере
- Установка на клиенте данного свойства при определенных условиях
- Понимаем, что при созданной моделе нашего приложения внести дополнительную функциональность по редактированию оценки займет 15-20 минут !!!
- Демонстрация "подводного камня" и способа не попасть на него при добавлении функционала на редактирования оценки
- DataRowVersion.Proposed и DataRowVersion.Original
- Метод CellEndEdit - на каком этапе есть доступ к данным DataRowVersion.Proposed и когда єтот доступ исчезает
- Демонстрация сего на возникновении Exception
- Когда же вызывается метод EndEdit самой программой и почему мы ускоряем его ручным вызовом в методе CellEndEdit?
- DataRowState, DataRowVersion, EndEdit, AcceptChanges - последние пояснения данных методов и свойств и их взаимозависимостей

ВНИМАНИЕ!
Данная часть курса не является самостоятельной единицей, а лишь
входит в состав расширенной версии второй части курса, посвященной технологии
ADO.NET.
Но Вы можете заказывать либо базовую версию второй части курса, либо
полную, включая данное расширение, либо само расширение.
Цена курса составляет:
$25,00
за DVD диски
или
10$ за электронные файлы
Перейти на страницу часто задаваемых вопросов
ИП Гудок Александр Сергеевич.
Служба поддержки
Телефон в Украине (Киевстар): +38 (067) 895-96-03
Все права защищены. Copyright © 2011. Александр Гудок. ИНН: 2998904311