C# — C# Нужна помощь по Windows Forms


Содержание

Создание служб Windows с помощью C#

Служба Windows – это специальная служебная программа, которая запускается операционной системой автоматически при загрузке вне зависимости от статуса пользователя или вручную (в зависимости от настроек).

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

Также, в отличие от «обычных» программ, службы не имеют графического интерфейса и управляются при помощи специального диспетчера.

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

В этой статье мы рассмотрим пример создания службы Windows с использованием языка программирования C#.

Создание службы

Для того, чтобы создать проект службы необходимо в окне создания нового проекта выбрать пункт «Служба Windows ».

После этого Visual Studio создаст новый проект с «каркасом» службы.

К сожалению, в отличие, например, от Windows Forms или консольного приложения данный «каркас» не самодостаточен. То есть, установить в систему и запустить в работу такую «пустую» службу нельзя. Необходимо дописать рабочий функционал и логику установки в систему.

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

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

Ниже представлен такой класс для нашей службы.

Поиск элемента по имени в WinForms

Мне надо на форме именно найти элемент ( button , panel и т.д.) по его name (имени переменной). Как это сделать?

1 ответ 1

Метод Control.ControlCollection.Find — выполняет поиск элементов управления по их свойству Name и создает массив из всех элементов управления, которые соответствуют условиям поиска.

Поиск элементов, совпадающих по имени, будет выглядеть так:

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

C# — C# Нужна помощь по Windows Forms

нет не работает же. может Вы на одном компе запустили?
1. Компов я подключил на разные сети (просто мне так захотелось)
2. У сервера например 69.112.43.104 и ждет на порте 15000
3. Клиент совсем с другой сети отправлет привет на 69.112.43.104 на на порт 15000.
4. УПС. но на сервер не приходит.

если клиент и сервер запускать на одном компе то работает в норме.

25.12.2015, 00:34 #5

нет не работает же. может Вы на одном компе запустили?
1. Компов я подключил на разные сети (просто мне так захотелось)
2. У сервера например 69.112.43.104 и ждет на порте 15000
3. Клиент совсем с другой сети отправлет привет на 69.112.43.104 на на порт 15000.
4. УПС. но на сервер не приходит.

если клиент и сервер запускать на одном компе то работает в норме.

25.12.2015, 11:44 #6
Пепел Феникса
Посмотреть профиль
Найти ещё сообщения от Пепел Феникса
25.12.2015, 13:34 #7

от провайдера идет ж.
да и из-за IPv6 такое тож возможно.

плюс не всегда нужен белый, у некоторых можно договорится на статичный внешний IP + форвардинг на какой-то из портов.

Напишу программу на C#. WinForms, WPF, ASP NET

Об этом кворке

Напишу программу на C# в среде программирования Visual Studio 2020. Делаю проект за 1 — 3 дня, в зависимости от сложности задания.

Любые версии dotNET Framework. Исходный код, проект для Visual Studio оставляю Вам.

На C# программирую более 3 лет. Могу писать курсовые. Знаю:

  1. WPF
  2. Windows Forms
  3. Консольные приложения
  4. ASP NET
  5. Работа с БД (Access: accdb, mdb. MSSql, MySql)
  6. Парсинг веб страниц
  7. Взаимодействие программы с Microsoft Office (Word, Excel)
  8. Работа с API сайтов
  9. Работа с ботами Telegram

Что Вы получите, заказав мой kwork:

  1. Скомпилированная программа под Windows (архив со всеми нужными файлами)
  2. Проект для Visual Studio (архив со всеми исходники и прочим)

Дополнительные услуги:

  1. Комментарии. Делаю подробные комментарии, почти к каждой строке кода.

От Вас требуется четкое ТЗ. Описание функций программы.

Если Вам нужна доработка уже существующей программы, то скидывайте ее проект для Visual Studio.

Если нужно, укажите версию . NET Framework. Более низкие версии — большая совместимость с Windows старых версий (XP, Vista).

C# — C# Нужна помощь по Windows Forms

Наследование позволяет создавать в Visual C# 2005 эффективные пользовательские элементы управления. С помощью наследования можно создавать элементы управления, которые не только сохраняют все функциональные возможности стандартных элементов управления форм Windows Forms, но и реализуют пользовательские функции. В этом пошаговом руководстве будет создан простой наследуемый элемент управления ValueButton . Этот элемент наследует функциональные возможности стандартной кнопки Button Windows Forms и реализует настраиваемое свойство ButtonValue .

25.12.2015, 13:43 #8

Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих настроек или выпуска. Чтобы изменить параметры, в меню Сервис выберите команду Импорт и экспорт параметров. Дополнительные сведения см. в разделе Customizing Development Settings in Visual Studio.

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

Чтобы создать библиотеку элементов управления ValueButtonLib и элемент управления ValueButton

В меню Файл выберите Создать и выберите пункт Проект, чтобы открыть диалоговое окно Новый проект.

Из списка проектов Visual C# выберите шаблон проекта Библиотека элементов управления Windows Forms и в поле Имя введите ValueButtonLib.

Имя проекта ( ValueButtonLib ) также назначается по умолчанию корневому пространству имен. Для определения имен компонентов в сборке используется корневое пространство имен. Например, если в двух сборках содержатся компоненты с именем ValueButton , то можно указать свой компонент ValueButton , используя имя ValueButtonLib.ValueButton . Дополнительные сведения см. в разделе Пространства имен (Руководство по программированию в C#).

В обозревателе решений щелкните правой кнопкой мыши UserControl1.cs и выберите в контекстном меню команду Переименовать. Измените имя файла на ValueButton.cs. Нажмите кнопку Да, чтобы переименовать все ссылки на элемент кода UserControl1 .

В обозревателе решений щелкните правой кнопкой мыши файл ValueButton.cs и выберите Просмотреть код.

Найдите строку инструкции >public partial class ValueButton , и измените тип, наследуемый этим элементом управления от UserControl, на Button. То позволит элементу управления унаследовать всю функциональность элемента управления Button.

В обозревателе решений откройте узел ValueButton.cs для отображения созданного файла кода ValueButton.Designer.cs. Откройте этот файл в Редакторе кода.

Найдите метод InitializeComponent и удалите строку, присваивающую свойство . Это свойство отсутствует в элементе управления Button.

Из меню Файл выберите команду Сохранить все, чтобы сохранить проект.

Примечание

Обратите внимание на то, что наглядный конструктор теперь недоступен. Поскольку элемент управления Button определяет свойства своего отображения, их нельзя изменить в конструкторе. Он будет иметь точно такое же визуальное представление, как и класс, наследником которого он является (то есть Button), если в коде не было указано иначе. На поверхность разработки несмотря на это можно добавлять компоненты, не имеющие элементов пользовательского интерфейса.

Один из возможных способов использования наследуемых элементов управления форм Windows Forms — это создание элементов управления, внешне идентичных стандартным элементам управления, но предоставляющих настраиваемые свойства. В этом разделе в элемент управления будет добавлено свойство ButtonValue .

Чтобы добавить свойство Value, выполните следующие действия.

В обозревателе решений щелкните правой кнопкой мыши ValueButton.cs и выберите команду Просмотреть код.

Найдите инструкцию class. Сразу после закрывающей скобки ( < ) введите следующий код:

В этом коде задаются методы для сохранения и извлечения свойства ButtonValue . Оператор get задает значение, которое сохраняется в закрытой переменной varValue , а оператор set присваивает значение закрытой переменной с помощью зарезервированного слова value.

Из меню Файл выберите команду Сохранить все, чтобы сохранить проект.

Элементы управления не являются автономными проектами; они должны быть включены в контейнер. Чтобы протестировать элемент управления, необходимо предоставить для его запуска тестовый проект. Также необходимо сделать элемент управления доступным для тестового проекта, построив (скомпилировав) его. В этом разделе демонстрируется построение элемента управления и его тестирование в форме Windows Form.

Чтобы построить элемент управления

В меню Построение выберите Построить решение.

При построении компилятор не должен выдать ни одной ошибки или предупреждения.

Чтобы создать тестовый проект

В меню Файл выберите Добавить и щелкните Новый проект, чтобы открыть диалоговое окно Добавление нового проекта.

Выберите узел Windows под узлом Visual C# и щелкните Приложение Windows Forms.

В поле Имя введите Test.

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

Перейдите на вкладку Проекты. Под строкой Имя проекта будет отображен проект ValueButtonLib . Дважды щелкните проект, чтобы добавить ссылку на тестовый проект.

В обозревателе решений щелкните правой кнопкой мыши Test и выберите пункт Построить.

Чтобы добавить элемент управления в форму, выполните следующие действия.

В обозревателе решений щелкните правой кнопкой мыши Form1.cs и выберите команду Открыть в конструкторе.

На панели элементов щелкните ValueButtonLib Components. Дважды щелкните ValueButton.

Элемент ValueButton появится в форме.

Щелкните правой кнопкой мыши элемент ValueButton и выберите в контекстном меню команду Свойства.

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

Установите свойство ButtonValue равным 5.

На вкладке Все формы Windows Formsпанели элементов дважды щелкните Подпись, чтобы добавить в форму элемент Label.

Переместите подпись в центр формы.

Дважды щелкните файл valueButton1 .

В Редакторе кода откроется событие valueButton1_Click .

Вставьте следующую строку кода.


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

В меню Отладка выберите команду Начать отладку.

Нажмите кнопку valueButton1 .

В элементе label1 будет отображена цифра 5, что подтверждает передачу свойства ButtonValue наследуемого элемента управления элементу label1 с помощью метода valueButton1_Click . Таким образом, элемент управления ValueButton наследует все функциональные возможности стандартной кнопки форм Windows Forms и, кроме того, предоставляет дополнительное настраиваемое свойство.

Программирование в .NET Framework

Приложения Windows Forms

Если вы захотите писать программы, похожие на привычные приложения Windows, то наверняка воспользуетесь классами из пространства имен System.Windows.Forms . Они позволяют задействовать кнопки, списки, текстовые поля, меню, окна сообщений и множество других «элементов управления». Элементы управления — это то, что вы помещаете в форму. Они нужны для вывода информации, например, текстовой (элемент управления Label ) или графической (элемент управления PictureBox ), либо для выполнения определенных действий, например, выбора значения или перехода к другой форме после нажатия кнопки. Все элементы управления помещаются на форму.

Понятие «форма», принятое в программировании, родственно понятию «форма анкеты» или «форма документа» из обычной жизни. На форме можно в определенном порядке расположить различные элементы (текст , картинки, поля для заполнения и т. д.). Когда нам дают готовую форму документа и просят ее заполнить, мы обычно читаем содержащуюся в ней типовую информацию, а затем вписываем недостающие данные в определенные строки.

В программировании понятие формы во многом похоже: форма позволяет размещать текст, изображения, поля ввода, кнопки и т. п., добиваясь их точного расположения на экране. В консольном приложении на экран выводятся только строки текста.

Компания Майкрософт предоставила в составе библиотеки классов .NET Framework огромное количество «элементов управления», которые можно помещать на формы. Освоив этот инструмент, вы сможете быстро создавать эффектные приложения.

Некоторые полезные классы из пространства имен System.Windows.Forms

Вот некоторые элементы управления, которые можно размещать на формах:

  • Label (Надпись).
  • Button (Кнопка).
  • ListBox (Список).
  • CheckBox (Флажок).
  • RadioButton (Переключатель).
  • MessageBox (Окно сообщений).
  • Menu (Меню).
  • TabControl (Управление вкладками).
  • Toolbar (Панель инструментов).
  • TreeView (Дерево).
  • DataGrid (Сетка данных).
  • PictureBox (Изображение).
  • RichTextBox (Текстовое поле с поддержкой формата RTF ).

Работа с примерами программ Windows Forms в Visual C# Express

Возможно, вы предпочтете не использовать уже заготовленные примеры проектов, а разрабатывать их «с нуля». В таком случае нужно учесть, что для каждого проекта C# Express сразу же создает два файла (с именами Form1.cs и Program.cs ) и наполняет их исходным кодом на языке C#, то есть вы изначально получаете простейшую, но полноценную программу. Предлагаемый нами способ работы с уже полученным проектом состоит в выполнении следующих действий:

  • Удалите файл Form1.cs.
  • Замените код в файле Program.cs на код примера, с которым вы работаете.

Оба этих действия не понадобятся, если вы открываете программы с помощью команды «Открыть проект» в меню «Файл» и находите нужный проект в той папке, куда его поместили после разархивации.

Пример программы 3.3

Рассмотрим пример простейшего приложения Windows Forms. Оно всего лишь создает новую форму и выводит определенный текст в заголовок окна формы.

Пример программы 3.4

Следующий пример тоже достаточно прост, но мы делаем шаг вперед — размещаем на форме кнопку.

Пример программы 3.5

Кнопку на форму мы поместили, но при нажатии на нее ничего не происходит. Это скучно.

Нам нужно описать метод, который будет выполнять какое-либо действие при нажатии на кнопку. Пусть при этом текст в заголовке окна будет меняться. Поскольку такой метод отслеживает наступление некоторого события (в нашем случае – нажатие на кнопку) и затем каким-то образом обрабатывает его, он, напомним, называется «обработчик события». Кроме того, надо привязать обработчик события к соответствующему событию, то есть к нажатию на кнопку.

Пример программы 3.6

Мы добились успеха: наша программа умеет выполнять основные действия. Теперь добавим на форму несколько новых элементов управления, аккуратно разместим их и немного поработаем с ними. Возьмем элементы управления 4-х типов: Button, ListBox, MessageBox и PictureBox.

BestProg

Пример создания отчета в приложении. Элемент управления Report Viewer . База данных Microsoft Access

В данном примере приводится пошаговый процесс создания отчета средствами Microsoft Visual Studio . Используя подобный пример, можно создавать отчеты и для других СУБД, например, Microsoft SQL Server .

Конкретный пример для формирования отчета в СУБД Microsoft SQL Server приводится в теме:

Содержание

Условие задачи

Задана база данных с именем «Education.mdb» , которая была сформирована в системе управления базами данных Microsoft Access . Архив с файлом базы данных можно загрузить здесь.

База данных состоит из 2-х таблиц:

  • таблица Student ;
  • таблица Session .

Структура таблицы Student .

Примечание
Название поля Тип данных Комментарий
ID_Book Целое число ( int ) Уникальный идентификатор поля, ключевое поле, счетчик
Num_Book Текстовый (10 символов) Номер зачетной книжки студента
Name Текстовый (30 символов) Фамилия и имя студента
Year Целое число ( int ) Год рождения

Структура таблицы Session

Название поля Тип данных Комментарий
ID_Session Целое число (int) Уникальный идентификатор поля, ключевое поле, счетчик
ID_Book Целое число (int) Номер зачетной книжки
Mathematics Целое число (int) Оценка по математике
Informatics Целое число (int) Оценка по информатике
Philosophy Целое число (int) Оценка по философии

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

Рис. 1. Схема связей между таблицами Student и Session

Разработать приложение, которое демонстрирует использование отчетов. Сформировать отчет, который содержит следующую информацию:

  • номер зачетной книжки (таблица Student );
  • фамилия и имя студента (таблица Student );
  • оценка по математике (таблица Session );
  • оценка по информатике (таблица Session );
  • оценка по философии (таблица Session);
  • средняя оценка (вычисляемое поле).

Данные из отчета будут получаться из запроса, сформированного СУБД Microsoft Access . Запрос называется Query1 . Отчет должен отображаться в отдельной форме.

Соображения

Чтобы создать отчет в Microsoft Visual Studio , нужно, чтобы в базе данных Microsoft Access был создан запрос. Запросам в Microsoft Access соответствуют представления ( Views ) в Microsoft Visual Studio .

Поэтому, сначала в Microsoft Access создается запрос, который формирует результирующую таблицу в соответствии с условием задачи. Затем этот запрос используется для отображения отчета.

Если в приложении нужно создать несколько различных отчетов, тогда в Microsoft Access нужно создать точно такое же количество запросов для каждого отчета.

Выполнение

1. Запустить систему Microsoft Visual Studio . Создать проект по шаблону Windows Forms Application

После запуска Microsoft Visual Studio нужно создать новый проект. Подробный пример создания и сохранения нового проекта по шаблону Windows Forms Application описывается в теме:

2. Создать базу данных или загрузить готовый файл базы данных

База данных была ранее создана средствами СУБД Microsoft Access . База данных содержит две связанные между собой таблицы Student и Session , а также запрос Query1 на основе которого будет формироваться отчет.

Файл готовой базы данных можно загрузить здесь .

3. Подключение файла базы данных к проекту

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

Чтобы использовать базу данных «Education.mdb» нужно подключить ее к проекту стандартным способом. Для подключения файла базы данных к проекту используется команда «Add Connection…» из контекстного меню, которое вызывается в перечне Data Connections (рисунок 2).

Другой способ – выбрать команду «Connect to Database» (рисунок 2).

Рис. 2. Варианты подключения файла базы данных к проекту

В результате откроется окно мастера, в котором нужно выполнить следующие действия:

  • в окне «Choose Data Source» , изображенном на рисунке 3, выбрать источник данных ( Data Source ) – Microsoft Access Database File ;
  • в следующем окне «Add Connection» в поле «Database file name» задать путь к файлу базы данных как показано на рисунке 4 (кнопка «Browse…» ).

Рис. 3. Окно «Choose Data Source» . Выбрано «Microsoft Access Database File»

Рис. 4. Окно Add Connection

Более подробно, подключение файла базы данных Microsoft Access к проекту описывается в теме:

После подключения, окно Server Explorer примет вид, как показано на рисунке 5.

Рис. 5. Отображение содержимого базы данных Education.mdb в окне Server Explorer

4. Разработка главной формы приложения

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


Рис. 6. Главная форма приложения

Как видно из рисунка, форма содержит только один элемент управления типа Button (кнопка) с именем button1 . После клика на кнопке «Show Report» будет отображен отчет в другой форме.

Настраиваются следующие свойства элементов управления:

  • в элементе управления button1 свойство Text = «Show Button» ;
  • в элементе управления Form1 (главная форма) свойство Text = «Report Viewer» .
5. Подключение файла отчета к проекту

В системе Microsoft Visual Studio каждому отчету соответствует файл, который имеет расширение «*.rdlc» . Этот файл содержит данные, которые формируются в отчете.

Для создания файла в Microsoft Visual Studio нужно вызвать команду Add New Item из меню Project (рисунок 7).

Рис. 7. Команда Add New Item… из меню Project

В результате откроется окно «Add New Item…» , в котором нужно выбрать шаблон Report (рисунок 8) и задать имя для файла отчета Report1.rdlc (по умолчанию).

Рис. 8. Выбор шаблона Report и задание имени Report1.rdlc для файла отчета

После подтверждения выбора (кнопка Add ), окно Microsoft Visual Studio примет вид, как показано на рисунке 9.

Рис. 9. Окно вкладки, которая соответствует файлу Report1.rdlc

6. Проектирование отчета

Перед проектированием отчета нужно активировать окно файла «Report1.rdlc [Design]» .

6.1. Панель инструментов ToolBox

Для проектирования элементов отчета используется панель ToolBox (рисунок 10).

Рис. 10. Панель ToolBox с инструментами, которые необходимы для проектирования отчета

6.2. Элементы управления, предназначенные для формирования отчета

Система Microsoft Visual Studio предлагает ряд элементов управления, которые можно использовать для разработки отчета. С помощью этих элементов управления можно проектировать внешний вид (представление) разнообразных отчетов.

Предлагаются такие элементы управления:

  • элемент управления типа TextBox . Отображает метки, поля или значения, которые получаются в результате вычислений;
  • элемент управления типа Line . Рисует линию, которая имеет толщину от 1 точки и более;
  • элемент управления типа Table . Этот элемент управления отображает данные в сетке ( grid ), имеющей фиксированное количество колонок и переменное количество строк;
  • элемент управления типа Matrix . Отображает агрегированные данные в сетке, которая имеет переменное количество колонок и переменное количество строк;
  • элемент управления типа Rectangle . Рисует прямоугольник как контейнер для других элементов отчета;
  • элемент управления типа List . Отображает набор элементов отчета, которые повторяются для каждой группы или строки данных;
  • элемент управления типа Image . Отображает изображение в виде битовой карты (например, логотип, фото);
  • элемент управления типа Subreport . Отображает связанный подотчет в границах данного отчета;
  • элемент управления типа Chart . Отображает данные в виде диаграмм разных видов;
  • элемент управления типа Gauge . Отображает значение, поле или выражение в виде линейной или радиальной зависимости.

Не вдаваясь в особенности использования каждого элемента управления, для решения нашей задачи будем использовать элемент управления Table . Этот элемент управления отображает данные в сетке ( grid ), которые имеют фиксированное количество колонок и переменное количество строк.

6.3. Настройка элемента управления типа Table
6.3.1. Настройка источника данных для элемента управления Table

Чтобы разместить элемент управления типа Table на макете отчета, нужно его выделить (мышкой) в панели Toolbox и сделать клик в области отчета. В результате загрузится мастер настройки источника данных.

В первом окне мастера Data Source Configuration Wizard нужно выбрать источник данных Database (рисунок 11).

Рис. 11. Выбор источника данных, из которого приложение будет получать данные для отчета

После выбора «Next >» откроется следующее окно (рисунок 12). В этом окне нужно выбрать модель базы данных Dataset . Выбранная модель базы данных определяет типы данных объектов, которые использует приложение. Эта модель будет добавлена к нашему проекту.

Рис. 12. Выбор модели данных Dataset

После выбора «Next >» откроется следующее окно (рисунок 13). В этом окне нужно выбрать соединение с базой данных, которой соответствует файл Education.mdb . Этому соединению соответствует строка Connection String , которая формируется системой автоматически.

Рис. 13. Настройка соединения с базой данных. Строка ConnectionString

После выбора «Next >» нужно подтвердить копирование файла базы данных в текущий проект (рисунок 14). В результате строка соединения модифицируется. Поскольку, база данных Education.mdb уже подключена к проекту (смотрите п.3), то рекомендуется выбрать «Нет» .

Рис. 14. Окно уточнения копирования файла базы данных в текущий проект

В следующем окне (рисунок 15) предлагается сохранить строку Connection String в конфигурационном файле приложения. Нужно оставить все без изменений и выбрать «Next >» .

Рис. 15. Окно с предложением сохранения строки Connection String в конфигурационном файле приложения

Следующим есть окно выбора объектов базы данных, которые будут включены в набор данных (рисунок 16). В нашем случае нужно выбрать все элементы запроса Query1 , который был сформирован средствами СУБД Microsoft Access .

Рис. 16. Выбор объектов для отображения

После выбора кнопки «Finish» отобразится предварительно открытое окно Dataset Properties с созданным набором данных (рисунок 17). В этом окне отображаются поля запроса Query1 , которые будут отображаться в отчете. Следует напомнить, что запрос Query1 был спроектирован средствами СУБД Microsoft Access.

Рис. 17. Окно Dataset Properties с отображенными полями запроса Query1

По желанию, можно создать еще один (или несколько) источник данных с помощью кнопки New… (див. рисунок 17).

После подтверждения на OK , окно файла отчета Report1.rdlc будет иметь вид, как показано на рисунке 18.

Рис. 18. Окно файла отчета Report1.rdlc после размещения и настройки таблицы Table

6.3.2. Настройка столбцов таблицы для отображения в отчете

В элементе управления Table1 существует две области:

  • область Hеаdеr , которая отображает заголовок каждого столбца таблицы
  • область Data , которая отображает набор данных, которые выводятся в каждой строке таблицы. Набор данных формируется на основе запроса Query1 .
6.3.2.1. Настройка заголовков

Чтобы настроить название каждого столбца нужно сделать двойной клик мышкой в соответствующей ячейке области Header так, как это показано на рисунке 19.

Рис. 19. Настройка заголовка для поля «№ зачетной книжки»

Как видно из рисунка, система сформировала таблицу, которая содержит 3 столбца. В нашем случае, запрос Query1 содержит 6 столбцов. Чтобы добавить столбец, нужно:

  • сделать клик правой кнопкой мышки на границе таблицы (серый фон) в соответствующем столбце;
  • выполнить команду Left или Right меню Insert Column (рисунок 20).

Рис. 20. Вызов команды добавления нового столбца

Чтобы разместить название заголовка таблицы по центру, используется свойство TextAlign (см. рисунок 21) объекта TextBox13 , который был создан для первого столбца таблицы с названием «Book number» .

Рис. 21. Установка центрирования заголовка таблицы

Также, можно настроить ширину каждого столбца таблицы.

После настройки всех заголовков, окно файла отчета будет иметь вид, как показано на рисунке 22.

Рис. 22. Окно отчета после настройки заголовков таблицы

6.3.2.2. Настройка отображения данных

На этом этапе нужно настроить отображение данных, которые будут отображаться в строках таблицы. Количество строк, которые будут отображаться, может быть любым. Данные отображаются в области Data таблицы.

Каждый столбец таблицы настраивается по отдельности. Первым столбцом в запросе Query1 есть столбец с названием Num_Book . Этот столбец нужно выбрать в контекстном меню таблицы как показано на рисунке 23.

Рис. 23. Настройка отображения данных в столбце Book number (№ зачетной книжки)

Соответствующие поля запроса Query1 выбираются во всех последующих столбцах. После формирования всех столбцов, таблица примет вид, как показано на рисунке 24.

Рис. 24. Окно отчета после настройки таблицы

6.4. Настройка заголовка отчета

Для задания заголовка отчета используется инструмент TextBox (см. рисунок 25), который нужно разместить над таблицей. После размещения, будет создан соответствующий объект. Чтобы задать название, нужно сделать клик в прямоугольной области инструмента TextBox .

Рис. 25. Задание заголовка отчета «Query1»

По желанию, можно улучшить (изменить) вид отчета с помощью других инструментов.

7. Проектирование дополнительной формы и связывание отчета с формой

В соответствии с условием задачи, при клике на кнопке «Show Report» может открыться новая форма приложения с созданным отчетом. Поэтому, в программе нужно разработать новую форму.

7.1. Добавление формы к проекту

Разработка дополнительной формы реализуется стандартным для MS Visual Studio способом. Более подробный пример создания новой формы описывается в теме:

Сначала нужно добавить форму (файл формы, ресурс) к проекту с помощью команды

В результате откроется окно «Add New Item» , в котором нужно выбрать шаблон Windows Form и оставить имя файла Form2.cs предлагаемое системой.

Рис. 26. Окно задания шаблона создаваемой формы

В результате, Microsoft Visual Studio создаст новую форму, которая, пока что не имеет никаких элементов управления. Форме соответствует класс с именем Form2 .

7.2. Элемент управления Report Viewer

Чтобы в приложении мог отображаться отчет, в системе Microsoft Visual Studio предусмотрен элемент управления Report Viewer (рис. 27). Этот элемент управления осуществляет связь приложения (программы) с файлом отчета Report1.rdlc . Сначала нужно перейти в режим проектирования формы «Form2.cs [Design]» . Далее, из панели инструментов ToolBox во вкладке Reporting нужно выбрать элемент управления ReportViewer и с помощью мышки разместить его на форме Form2, как показано на рисунке 27. В результате система автоматически предложит выбрать файл отчета в окне ReportViewer Tasks (см. рис. 27). Кроме того, для элемента управления будет сформирован экземпляр (объект) с именем reportViewer1 .

Рис. 27. Размещение элемента управления Report Viewer на форме

После выбора кнопки спадающего списка, в окне Report Viewer Tasks отобразится список подключенных (созданных) файлов отчетов. В нашем случае нужно выбрать один файл с именем TrainReports1.Report1.rdlc (рис. 28). Здесь префикс TrainReports1 означает имя нашего проекта.

Рис. 28. Подключение файла проекта к элементу управления ReportViewer

После выбора файла Report1.rdlc , корректировки размеров формы Form2 и корректировки размеров reportViewer1 , окно формы примет вид как показано на рисунке 29.

Рис. 29. Окно дополнительной формы после размещения и настройки элемента управления ReportViewer

Система автоматически сгенерирует три объекта с именами EducationDataSet , Query1BindingSource и Query1TableAdapter . Эти объекты связывают приложение с базой данных. Их можно использовать для программного управления отчетом. Но это уже совсем другая тема.

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

Рис. 30. Проверка связи reportViewer1 с файлом отчета Report1.rdlc


8. Листинг файла формы Form2.cs

После настройки reportViewer1 , система автоматически сформирует код отображения отчета на форме в обработчике события Load формы Form2 . Событие Load формы Form2 вызовется в момент, если нужно отобразить форму на экране. Поэтому, вызов формы Form2 из основной формы ( Form1 ) автоматически отобразит отчет.

Общий листинг модуля Form2.cs следующий:

9. Программирование вызова кнопки «Show Report» для вызова отчета из главной формы

Последний шаг – это запрограммировать клик на кнопке «Show Report» главной формы.

Вызов обработчика события Click клика на кнопке Show Report выполняется стандартным для MS Visual Studio способом. Подробное описание программирования события описывается в теме:

Не вдаваясь в детали программирования события, ниже приведен код обработчика события button1_Click() , из которого вызывается отчет

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

10. Листинг файла Form1.cs
11. Запуск приложения на выполнение (тестирование)

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

Заблуждения начинающих C# разработчиков. Пытаемся ответить на стандартные вопросы

Недавно мне выпала возможность пообщаться с довольно большим количеством начинающих специалистов по разработке на языке C#. Многие из них интересуются языком и платформой, и это очень круто. Среди зеленых юниоров распространено мракобесие по поводу очевидных (только что прочитавшему книгу про память) вещей. И это же натолкнуло меня на мысль о создании этой статьи. Статья в первую очередь нацелена на начинающих разработчиков, но думаю, что многие факты будут полезны и практикующим инженерам. Ну и самые очевидные и неинтересные заблуждения, разумеется, опущены. Здесь собраны наиболее интересные и значимые, особенно с точки зрения прохождения интервью.

#1. Мантра про 3 поколения в любой ситуации

Это скорее неточность, чем заблуждение. Вопрос про «сборщик мусора в C#» для разработчика стал классикой и уже мало кто не начнет на него бойко отвечать про концепцию поколений. Однако, почему-то, мало кто обращает внимание на то, что великий и ужасный сборщик мусора — часть рантайма. Соответственно, я бы дал понять, что не пальцем пихан, и спросил бы про какую среду исполнения идет речь. По запросу «сборщик мусора в c#» в интернетах можно найти более, чем много похожих сведений. Однако мало кто упоминает, что данная информация относится к CLR/CoreCLR (как правило). Но не стоит забывать и про Mono, легковесный, гибкий и встраиваемый рантайм, который занял свою нишу в мобильной разработке (Unity, Xamarin) и используется в Blazor. И для соответствующих разработчиков я бы посоветовал поинтересоваться подробностями устройства сборщика в Mono. Например, по запросу «mono garbage collector generations», можно увидеть, что поколения всего два — nursery и old generation (в новеньком и модном сборщике мусора — SGen).

#2. Мантра про 2 стадии сборки мусора в любой ситуации

Еще не так давно исходники сборщика мусора были скрыты от всех. Однако интерес к внутреннему устройству платформы был всегда. Поэтому информация извлекалась разными путями. И некоторые неточности при реверс-инжиниринге сборщика привели к мифу о том, что сборщик работает в 2 стадии: маркировка и чистка. Или и того хуже, 3 стадии — маркировка, чистка, сжатие.

Однако все изменилось, когда народ огня развязал войну с появлением CoreCLR и исходников сборщика. Код сборщика для CoreCLR был целиком взят из CLR версии. Никто с нуля его не писал, соответственно, почти все, что можно узнать из исходников CoreCLR, будет верно и для CLR. Теперь, чтобы понять, как что-то работает, достаточно зайти на github и найти это в исходном коде или прочитать readme. Там же можно увидеть, что существует 5 фаз: маркировки, планирования, обновления ссылок, компактинга (удаление с перемещением) и удаление без перемещений(перевести это дело сложно). Но формально это можно разделить на 3 этапа — маркировка, планирование, чистка.

На этапе маркировки выясняется, какие объекты не стоит собирать сборщику.
На этапе планирования производятся расчет различных показателей текущего состояния памяти и сбор данных, необходимых на этапе чистки. Благодаря информации, полученной на этом этапе, выносится решение о необходимости компактинга (дефрагментации), там же просчитывается, на сколько необходимо двигать объекты и т.д.

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

#3. Выделение памяти на куче так же быстро, как и на стеке

Опять же, скорее неточность, чем абсолютная неправда. В общем случае, конечно, разница в скорости выделения памяти минимальна. Действительно, в лучшем случае, при bump pointer allocation, выделение памяти — лишь сдвиг указателя, как и на стеке. Однако на выделение памяти в куче могут повлиять такие факторы, как присваивание нового объекта в поле старого (что затронет write barrier, обновляющий card table — механизм, позволяющий отслеживать ссылки из старшего поколения в младшее), наличие финализатора(необходимо добавить тип в соответствующую очередь) и др. Так же, возможно, объект будет записан в одну из свободных дыр в куче (после сборки без дефрагментации). А нахождение такой дыры происходить хоть и быстро, но, очевидно, медленнее, чем простой сдвиг указателя. Ну и разумеется каждый созданный объект приближает очередную сборку мусора. И на очередной процедуре выделения памяти она может случится. Что, естественно, займет некоторое время.

#4. Определение ссылочного, значимого типов и упаковки через понятия стека и кучи

Прямо классика, которая, к счастью, уже не так часто встречается.

Ссылочный тип располагается в куче. Значимый на стеке. Наверняка многие слышали эти определения очень часто. Но мало того, что это лишь частичная правда, так и определять понятия через протекшую абстракцию — не лучшая идея. За всеми определениями предлагаю обращаться к стандарту CLI — ECMA 335. Для начала стоит уточнить, что типы описывают значения. Так, ссылочный тип определяется следующим образом — значение, описываемое ссылочным типом (ссылка) указывает на расположение другого значения. Для значимого типа значение им описываемое является автономным(самосодержащим). Про то, где располагаются те или иные типы ни слова. Это является протекшей абстракцией, которую все же следует знать.

Значимый тип может располагаться:

  1. В динамической памяти (куче), если он является частью объекта, расположенного в куче, или в случае упаковки;
  2. На стеке, если он является локальной переменной/аргументом/возвращаемым значением метода;
  3. В регистрах, если то позволяет размер значимого типа и другие условия.

Ссылочный тип, а именно, значение на которое указывает ссылка, на текущий момент располагается в куче.

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

Упаковка также не определяется через места хранения. Рассмотрим краткий пример.

И соответственный IL код для метода Main

Так как значимый тип является частью ссылочного очевидно, что располагаться он будет в куче. И шестая строка дает ясно понять, что мы имеем дело с упаковкой. Соответственно, типичное определение «копирование из стека в кучу» дает сбой.

Чтобы определить, что есть упаковка, для начала стоит сказать, что для каждого значимого типа CTS(common type system) определяет ссылочный тип, который называется упакованным типом. Так, упаковка — операция над значимым типом, создающая значение соответствующего упакованного типа, содержащего побитовую копию оригинального значения.

#4. События — отдельный механизм

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

К сожалению, зачастую под событием понимается некий отдельный инструмент, тип, механизм. Особенно этому способствует тип из BCL EventHandler, имя которого наталкивает на мысли о том, что это что-то отдельное.

Определение события стоит начать с определения свойств. Я уже давно провел для себя такую аналогию, а недавно увидел, что она проведена и в спецификации CLI.

Свойство определяет именованное значение и методы, которые обращаются к нему. Звучит довольно очевидно. Переходим к событиям. CTS поддерживает события так же, как и свойства, НО методы для доступа отличаются и включают методы для подписки и отписки от события. Из спецификации языка C# — класс определяет событие… что напоминает объявление поля с добавлением ключевого слова event. Тип этого объявления должен быть типом делегата. Спасибо стандарту CLI за определения.

Итак, это означает, что событие — ничто иное, как делегат, который выставляет наружу лишь часть функциональности делегатов — добавление очередного делегата в список для выполнения, удаление из этого списка. Внутри же класса событие ничем не отличается от простого поля типа делегата.

#5. Управляемые и неуправляемые ресурсы. Финализаторы и IDisposable

Абсолютная путаница существует при работе с этими ресурсами. Этому во многом способствует интернет с тысячей статей о правильной реализации паттерна Dispose. Собственно, в этом паттерне ничего криминального нет — модифицированный шаблонный метод под конкретный случай. Но вопрос в другом — нужен ли он вообще. Почему-то, у части людей возникает непреодолимое желание реализовать финализатор на каждый чих. Скорее всего причиной этого является не полное понимание, что есть «неуправляемый ресурс». И строчки про то, что в финализаторах, как правило, освобождаются неуправляемые ресурсы из-за этого неполного понимания проходят мимо и не остаются в голове.

Неуправляемый ресурс — ресурс, который не является управляемым (как бы это странно ни было). А управляемый ресурс, в свою очередь, тот, который выделяется и высвобождается CLI автоматически через процесс который называется сборка мусора. Это определение я нагло содрал из стандарта CLI. Но если попытаться объяснить проще, то неуправляемые ресурсы — те, про которые не знает сборщик мусора. (Строго говоря мы можем давать сборщику немного информации про такие ресурсы с помощью GC.AddMemoryPressure и GC.RemoveMemoryPressure, это может оказать влияние на внутренние самотьюнинги сборщика). Соответственно, он не сможет сам позаботиться об их освобождении и поэтому мы должны сделать это за него. И подходов к этому может быть много. И чтобы код не пестрил от разнообразия воображения разработчиков, используются 2 общепринятых подхода.

  1. Интерфейс IDisposable (и его асинхронная версия IAsyncDisposable). Мониторится всеми анализаторами кода, так что забыть про его вызов сложно. Предоставляет единственный метод — Dispose. И поддержку компилятора — оператор using. Отличный кандидат на тело метода Dispose — вызов аналогичного метода одного из полей класса или освобождение неуправляемого ресурса. Вызывается явно пользователем класса. Наличие данного интерфейса у класса подразумевает, что по окончании работы с экземпляром, нужно вызвать этот метод.
  2. Финализатор. По своей сути является страховкой. Вызывается неявно, в неопределенное время, во время сборки мусора. Замедляет выделение памяти, работу сборщика мусора, продлевает время жизни объектов минимум до следующей сборки, а то и дольше, но зато вызывается сам, даже если его никто не вызывал. Из-за своей недетерминированной природы, в нем должны освобождаться только неуправляемые ресурсы. Также можно встретить примеры, в которых финализатор применялся для воскрешения(resurrection) объекта и организации пула объектов таким образом. Однако такая имплементация пула объектов — однозначно плохая идея. Как и пытаться логировать, кидать исключения, обращаться к базе и тысячи подобных действий.

И можно легко представить себе ситуацию при написании критической к производительности библиотеки, которая внутри использует неуправляемые ресурсы, что она обходится просто грамотным обращением с этим ресурсом, освобождая память аккуратно вручную. При написании таких высокопроизводительных библиотек, ООП, поддерживаемость и иже с ним уходит на второй план.

И вопреки утверждению, что Dispose нарушает концепцию, в которой CLR сделает все за нас, заставляет делать что-то самим, о чем-то помнить и тд, скажу следующее. При работе с неуправляемыми ресурсами, надо быть готовым, что они никем, кроме вас, не управляются. И вообще, ситуации, при которых данные ресурсы будут использоваться в ентерпрайсе, почти не встречаются. И в большинстве случаев можно обойтись замечательными классами обертками, вроде SafeHandle, который обеспечивает критическую финализацию ресурсов, предотвращая их преждевременную сборку.

Если же в вашем приложении по тем или иным причинам много ресурсов, требующих дополнительных действий для освобождения, то стоит взглянуть на отличный паттер компании JetBrains — Lifetime. Но не стоит его применять при виде первого же IDisposable объекта.

#6. Стек потока, стек вызовов, вычислительный стек и

Последний пункт добавил смеха ради, не думаю, что есть те, кто относит последнее к предыдущим двум. Однако путаницы с тем, что такое стек потока, стек вызовов и вычислительный стек довольно много.

Стек вызовов — структура данных, а именно стек, для хранения адресов возврата, для возвращения из функций. Стек вызовов — понятие больше логическое. Оно не регламентирует где и как должна храниться информация для возврата. Получается, что стек вызовов — самый обычный и родной нам стек т.е. Stack (Шутка). В нем же хранятся локальные переменные, через него передаются параметры и в нем же сохраняются адреса возврата при вызове инструкции CALL и прерываний, которые впоследствии используются инструкцией RET для возврата из функции/прерывания. Идем дальше. Одним из основных приколов потока является указатель на инструкцию, которая выполняется далее. Поток поочереди выполняет инструкции, объединяющиеся в функции. Соответственно у каждого потока есть стек вызовов. Таким образом получается, что стек потока и есть стек вызовов. То есть стек вызовов данного потока. Вообще, он также упоминается и под другими именами: программный стек, машинный стек.

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

Вычислительный стек (evaluation stack). Как известно, код C# компилируется в IL код, который входит в состав результирующих DLL (в самом общем случае). И как раз в основе среды выполнения, поглощающей наши DLL и выполняющей IL код лежит стек-машина. Почти все IL инструкции оперируют неким стеком. Например, ldloc загружает локальную переменную под определенным индексом на стек. Здесь под стеком понимается некий виртуальный стек, ведь в итоге эта переменная может с высокой вероятностью оказаться и в регистрах. Арифметические, логические и др IL инструкции оперируют с переменными со стека и кладут результат туда же. То бишь вычисления производятся через этот стек. Таким образом получается, что вычислительных стек — абстракция в рантайме. К слову, многие виртуальные машины основаны на стек-машине.

#7. Больше потоков — быстрее код

Интуитивно кажется, что обрабатывать данные параллельно будет быстрее, чем поочередно. Поэтому вооружившись знаниями о работе с потоками, многие пытаются запараллелить любой цикл и вычисление. Почти все уже знают про оверхед, который вносит создание потока, поэтому лихо используют потоки из ThreadPool и Task. Но оверхед создания потока — далеко не конец. Здесь мы имеем дело с еще одной протекшей абстракцией, механизмом, который используется процессором для повышения производительности — кеш. И как часто это бывает, кеш является обоюдоострым клинком. С одной стороны он значительно ускоряет работу при последовательном доступе к данным из одного потока. Но с другой стороны, при работе нескольких потоков, даже без необходимости их синхронизации, кеш не только не помогает, но еще и замедляет работу. Дополнительное время тратится на инвалидацию кэша, т.е. поддержание актуальных данных. И не стоит недооценивать эту проблему, которая по началу кажется пустяком. Эффективный с точки зрения кэша алгоритм будет выполняться одним потоком быстрее, чем многопоточный, в котором кэш используется неэффективно.

Также пытаться работать с диском из многих потоков — самоубийство. Диск и без того является тормозящим фактором многих программ, которые с ним работают. Если пытаться работать с ним из многих потоков, то надо забыть о быстродействии.

За всеми определениями рекомендую обращаться сюда:

C# Language Specification — ECMA-334
Просто хорошие источники:
Konrad Kokosa — Pro .NET Memory Management
CLI specification — ECMA-335
CoreCLR developers about runtime — Book Of The Runtime
От Станислава Сидристого про финализацию и прочее — .NET Platform Architecture

Типы приложений .NET

Язык C# можно использовать для создания консольных приложений — текстовых приложений, запускаемых в окне DOS. Скорее всего, такие приложения будут применяться для тестирования библиотек классов. Однако гораздо чаще язык C# придется использовать для создания приложений, имеющих доступ к множеству технологий, связанных с .NET. В данной статье представлен краткий обзор различных типов приложений, которые можно писать на C#.

Создание приложений ASP.NET

Изначально появление ASP.NET 1.0 фундаментально изменило модель веб-программирования. ASP.NET 4 является старшим выпуском продукта и построен на базе прежних достижений. В ASP.NET 4 реализованы основные революционные шаги, направленные на повышение продуктивности работы. Главная цель ASP.NET 4 — позволить строить мощные, безопасные, динамичные приложения с использованием минимально возможного объема кода.

Возможности ASP.NET

Первое, и, возможно, самое важное — это то, что страницы структурированы. То есть каждая страница — это, по сути, класс, унаследованный от класса .NET System.Web.UI.Page, который может переопределить набор методов, вызываемых во время жизненного цикла объекта Page. (Можете воспринимать эти события как специфичные для страниц родственники событий OnApplication_Start и OnSession_Start, которые поступали в файлы global.asax в классической платформе ASP.) Поскольку функциональность страниц можно выделить в обработчики событий определенного назначения, страницы ASP.NET гораздо легче понять.

Другая приятная особенность страниц ASP.NET заключается в том, что их можно создавать в Visual Sludio 2010 — той же среде, в которой программируется бизнес-логика и компоненты доступа к данным, используемые этими же страницами ASP.NET. Проект Visual Studio 2010, или решение (solution), содержит все файлы, ассоциированные с приложением. Более того, классические ASP-страницы можно отлаживать непосредственно в редакторе. В прежние времена, связанные с Visual InterDev, существовала неприятная необходимость специально конфигурировать InterDev и веб-сервер проекта для включения отладки.

Для большей ясности средство отделенного кода (code-behind) ASP.NET позволяет распространить структурированный подход еще дальше. ASP.NET позволяет изолировать серверную функциональность страницы в классе, скомпилировать этот класс вместе с другими страницами в библиотеку DLL и разместить эту DLL в каталоге, находящемся ниже части HTML. Директива @Page, указанная в начале страницы, ассоциирует этот файл с классом. Когда браузер запрашивает страницу, веб-сервер генерирует события в классе, находящемся в файле класса страницы.

Последнее, но не менее важное свойство ASP.NET, которое следует упомянуть — это увеличенная производительность. В то время как классические ASP-страницы интерпретировались при каждом обращении к странице, страницы ASP.NET после компиляции подвергаются кэшированию на веб-сервере. Это значит, что все последующие запросы страниц ASP.NET выполняются быстрее, чем первый.

ASP.NET также облегчает написание страниц, отображающих формы в браузере, которые можно применять в корпоративной сети. Традиционное мнение о приложениях, ориентированных на формы, заключается в том, что они предоставляют развитый пользовательский интерфейс, однако их сложнее сопровождать, поскольку они запускаются на многих клиентских машинах. По этой причине люди полагаются на приложения, ориентированные на формы, только тогда, когда необходим развитый интерфейс и имеется возможность обеспечить надежную поддержку пользователям.

Веб-формы

Чтобы еще более облегчить конструирование веб-страниц, в Visual Studio 2010 предлагается библиотека Web Forms (Веб-формы). Это средство позволяет графически создавать страницы ASP.NET — точно так же, как создаются окна в Visual Basic 6 и в C++Builder. Другими словами, потребуется перетащить необходимые элементы управления из панели инструментов на поверхность формы, затем слегка подкорректировать код формы и написать обработчики событий для элементов управления. При использовании языка C# для создания веб-формы, вы создаете класс C#, унаследованный от базового класса Page, и страницу ASP.NET, которая отображает этот класс в качестве своего отделенного кода. Разумеется, вы не обязаны применять для создания веб-формы именно C#; для этого можно воспользоваться также Visual Basic 2010 или любым другим языком, ориентированным на .NET.

В прошлом сложность веб-разработки удерживала некоторые команды разработчиков от попыток ее освоения. Для достижения успехов в разработке веб-приложений приходилось знать множество разных технологий, таких как VBScript, ASP, DHTML, JavaScript и т.д. Применение концепций Web Forms к веб-страницам существенно упростило построение веб-приложений.

Элементы управления веб-сервера

Элементы управления, применяемые в веб-формах, не являются элементами управления в том же смысле, в каком ими являются элементы ActiveX. Вместо этого они представляют собой XML-дескрипторы, принадлежащие пространству имен ASP.NET, которые веб-браузер динамически трансформирует в HTML-дескрипторы и сценарии клиентской стороны, когда осуществляется запрос этой страницы. Удивительно то, что веб-сервер может отображать одни и те же элементы управления серверной стороны различными способами, генерируя трансформацию, соответствующую конкретному веб-браузеру, который прислал запрос. Это означает, что теперь можно легко создавать совершенные пользовательские интерфейсы веб-страниц, не заботясь о том, как достичь того, чтобы страница работала в любом из доступных браузеров — об этом позаботится Web Forms.

Веб-службы XML

На сегодняшний день HTML-страницы составляют большую часть трафика World Wide Web. Однако благодаря XML, компьютеры получают независимый от устройства формат, который может использоваться для их взаимодействия в Интернете. В будущем для обмена информацией компьютеры смогут использовать XML вместо того, чтобы пересылать друг другу по выделенным линиям сообщения в специальном патентованном формате, подобном EDI (Electronic Data Interchange — электронный обмен данными). Веб-службы XML предназначены для веб-среды, ориентированной на службы, когда удаленные компьютеры предоставляют друг другу динамическую информацию, которая может быть проанализирована и переформатирована, прежде чем получить свое окончательное представление для пользователя. Веб-службы XML — это простой способ для компьютеров предоставлять информацию в форме XML другим компьютерам в Интернете.

В рамках технической терминологии веб-служба XML в .NET — это страница ASP.NET, которая возвращает по запросам клиентов XML-код вместо HTML-кода. Такие страницы опираются на DLL-библиотеки отделенного кода, которые содержат классы, унаследованные от WebService. Интегрированная среда разработки Visual Studio 2010 предлагает механизм, облегчающий создание веб-служб.

Предприятие или организация может отдать предпочтение веб-службам XML по двум основным причинам. Первая причина заключается в том, что они основаны на HTTP; вебслужбы могут использовать существующие сети на базе HTTP в качестве посредников для передачи информации. Другая причина связана с тем, что поскольку веб-службы XML применяют XML, формат передаваемых данных является самодокументированным, открытым и независящим от платформы.

Создание Windows-форм

Хотя C# и .NET предназначены, в частности, для веб-разработки, они по-прежнему поддерживают так называемые приложения «толстого» клиента — т.е. приложения, которые должны устанавливаться на машине конечного пользователя, где и выполняется большая часть обработки. Это обеспечивает библиотека Windows forms (Windows-формы).

Однако, если вы начинаете изучать платформу .NET, я бы не рекомендовал вам изучать Windows Forms, а сразу переходить к изучению новейшей технологии WPF.

Windows Presentation Foundation (WPF)

Одной из новейших технологий революционного характера является Windows Presentation Foundation (WPF). При построении приложений WPF опирается на использование XAML. Аббревиатура XAML означает . Этот новый способ создания приложений внутри среды Microsoft, впервые представленный в 2006 г., является частью версий .NET Framework 3.0, 3.5 и 4. Это значит, что для того, чтобы запустить любое приложение WPF, необходимо удостовериться, что на машине клиента установлена платформа .NET Framework 3.0, 3.5 или 4. Приложения WPF доступны для ОС Windows 7, Windows Vista, Windows XP, Windows Server 2003 и Windows Server 2008 (только эти операционные системы позволяют устанавливать .NET Framework 3.0, 3.5 или 4).

XAML — это объявление XML, используемое для создания форм, которые представляют все визуальные аспекты и поведение приложений WPF. Поскольку с приложением WPF можно работать программно, эта технология представляет собой шаг в направлении декларативного программирования, к которому движется сегодня вся отрасль. Декларативное программирование означает, что вместо создания объектов посредством написания кода на компилируемом языке, таком как C#, VB или Java, все объявляется с помощью XML-подобного программирования.

Службы Windows

(Windows Service, изначально называвшаяся NT Service) — это программа, предназначенная для запуска в фоновом режиме в среде Windows NT/2000/XP/2003/ Vista/7 (но не Windows 9х). Эти службы удобны, когда нужно организовать непрерывную работу программ, готовых реагировать на события, без необходимости явного их запуска по инициативе пользователя. Хорошим примером является служба World Wide Web Service на веб-серверах, которая прослушивает веб-запросы клиентов.

Разрабатывать службы на языке C# очень просто. В пространстве имен System.Service.Process доступны базовые классы среды .NET, которые позволяют решать большинство шаблонных задач, связанных с системными службами. Кроме того, среда Visual Studio .NET позволяет создавать проект C# Windows Service, в котором для построения службы Windows используется исходный код C#.

Windows Communication Foundation (WCF)

Памятуя об этом, в Microsoft действительно собрали все эти технологии вместе, и в версии .NET Framework 3.0, а также и в ее включении в .NET Framework 3.5 и 4, имеется единый способ перемещения данных — Windows Communication Foundation (WCF). Библиотека WCF обеспечивает возможностью первоначального построения службы с последующей доставкой этой службы различными путями (даже по разным протоколам) простым изменением конфигурационного файла. WCF — очень мощное новое средство соединения распределенных систем.

Windows Workflow Foundation (WF)

Служба Windows Workflow Foundation (WF) впервые была представлена в версии .NET Framework 3.0, но теперь подверглась основательной перестройке, в результате чего многие теперь найдут ее гораздо более полезной. Вы обнаружите, что в Visual Studio 2010 значительно улучшены средства работы с WF, и создавать собственные рабочие потоки стало гораздо удобней. Вы также найдете новые средства управления потоком, класс Flowchart, а также ряд новых действий, таких как DoWhile, ForEach и ParallelForEach.

Windows.Form С# без визуальной студии

Я пытаюсь изучить Windows.Forms, и хотя у меня есть Visual Studio (редактирование, моя ошибка, очевидно), я чувствую, что я узнаю гораздо эффективнее, делая все в «Блокноте». Я искал везде учебник, который использует этот подход. Я, наконец, начал с http://www.geekpedia.com/tutorial33_Windows-forms-programming.html, но после первого примера он тоже начинает работать с несколькими файлами? как-то сгенерированный с помощью Visual Studio. Как я могу сделать это в «Блокноте»? Может ли кто-нибудь указать мне что-нибудь полезное?

** Хотя подавляющий ответ кажется сильно против этого, и я начал убеждаться, я видел, что SmokingRope говорил об этом так же просто, как писать все классы в один файл. Это то, что я делал до сих пор для значительных, а не проектов Windows.Form. Можете ли вы помочь объяснить, как эти необходимые файлы могут быть включены с помощью этого метода? *

Я имею в виду отсутствие неуважения, но подружиюсь с Visual Studio и занимаюсь обучением. Вы тратите свое время иначе.

На самом деле довольно легко кодировать С# вне IDE. Это в основном сводится к использованию компилятора csc.exe из командной строки.

Самая сложная часть этого процесса — убедиться, что переменные среды правильно настроены, и Microsoft предоставляет пакетный файл vsvars32.bat для выполнения именно этого.

Вот краткое руководство по использованию этого командного файла и компилятора из командной строки: http://www.zeusedit.com/forum/viewtopic.php?t=1235

И еще лучше, но немного более сложный подход заключается в использовании утилиты MsBuild для управления построением проекта: http://www.zeusedit.com/forum/viewtopic.php?t=2518 p >

Наконец, вы можете использовать внешний отладчик С# для отладки программ: http://www.zeusedit.com/forum/viewtopic.php?t=2507

Ваш лучший подход — это научиться писать код из Visual Studio. Вы получаете много помощи по кодированию (IntelliSense, проверка синтаксиса и т.д.), Которые помогут вам изучить язык.

Если вы действительно хотите использовать «Блокнот», вы создаете как можно меньше или столько файлов, а затем скомпилируете их в сборку с помощью компилятора командной строки, указав каждый файл в качестве ввода компилятору.

Реальность этого заключается в том, что использование блокнота и компилятора командной строки возможно, но очень громоздко и почти никогда не используется вне демонстрации простых примеров типа «Hello, world».

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

Но с помощью Notepad (или на LEAST используйте Notepad ++) расскажет больше о MSBuild и синтаксисе компилятора VBC или CSC, чем он расскажет вам о языковых функциях. Лучший способ узнать язык — это, как говорят другие, использование Visual Studio. Intellisense — отличный способ учиться.

Но это также делает нас ленивыми, и это правда, что нам не нужно запоминать так много. и иногда запоминание вещей пригодится. (то есть. Я нахожусь у клиента и удаленно подключился к серверам. не установлена ​​визуальная студия. НО. yippee. NET 2 есть. в этот момент вы будете оценили упражнение. )

Честно говоря, для этого достаточно для небольшого проекта я думаю, что это будет хорошее упражнение в обучении. Я говорю, иди за ним. Черт, я могу даже присоединиться к тебе.

Но, я думаю, самый лучший способ сделать это — использовать оба метода бок о бок. Например. Если вы хотите использовать несколько файлов, способ сделать это — создать папку и поместить в нее файл vbproj (или csproj). MSBuild.exe в качестве аргументов получает файлы vbproj (и файлы sln). Итак, одним из самых быстрых способов изучения синтаксиса файла vbproj является использование visual studio для создания проекта. и затем откройте файл vbproj в Notepad ++.

Проблема заключается в том, что Visual Studio ТАК УДИВИТЕЛЬНО, потому что она настолько абстрагируется от разработчика. Но глупо не признавать, что есть недостаток. Эта абстракция означает, что нам не нужно иметь такое глубокое понимание. Все просто работает автоматически. Поэтому я говорю, что копайте немного глубже. Я не думаю, что вы пожалеете об этом.

Цукерберг рекомендует:  Треугольник - Вопрос по созданию треугольников в CSS
Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих