Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
Другие темы раздела
C# Выбрать текстовый файл Есть папка с текстовыми файлами(1.txt...9.txt). Как открыть один из них используя combobox? Т.е в нем должны быть названия этих файлов. https://www.cyberforum.ru/ windows-forms/ thread1558172.html C# Передача данных из одного приложения в другое
У меня есть программа С# Windows Form, на выходе которой имею два массива. Я запустил эту программу и получаю каждую секунду новые массивы, вывожу их на график. Пришла пора их как-то передать в совсем другую программу. Просто, вот создам я пустой Windows Forms и надо бы написать что-то типа Idata,Qdata get(data from Windows Forms 1); Text1 = Idata; И чтобы после запуска второго приложения оно...
C# Исправьте алгоритм таким образом, чтобы он учитывал возможность определения палиндрома для строки https://www.cyberforum.ru/ windows-forms/ thread1558041.html
Int64 Factorial2 (Int64 num) { if (num == 0) Factorial2 = 1 else Factorial2 = num * Factorial2 (num-1) return Factorial2; }
C# Необработанное исключение типа System.IO.IOException https://www.cyberforum.ru/ windows-forms/ thread1557997.html
не могу понять в чем причина..
C# Ограничения перемещения формы
Здравствуйте, не получается ограничить перемещение формы, чтобы она не выходила за границы экрана. Сверху и справа ограничение работает, не знаю, как задать ограничение снизу и справа. Нашел в интернете, что есть класс Screen, но при этом не получается им воспользоваться. Как прописать ограничение через класс Screen? Или может есть другой вариант, но при этом без задания каких то констант?...
C# Не виден текст DataGridView Row HeaderText https://www.cyberforum.ru/ windows-forms/ thread1557935.html
Здравствуйте. Подскажите почему не получается сделать нумерацию строк DataGridView. Столбцы без проблем нумеруются. Такой вариант не помог. row.HeaderCell.Value = String.Format("{0}", row.Index + 1); И другие ...
C# Распределения случайной величины https://www.cyberforum.ru/ windows-forms/ thread1557895.html
Здравствуйте, кто может помочь, очень надо..( Задание: Написать программу(С# windows form) (Нужно отобразить графически на charte) для построения распределений с соответствующими параметрами: a. Бернулли p = 1 / (4); b. Биноминальной распределение p = 1 / (5), n = 23; c. распределение Пуассона λ = 23; d. равномерное распределение a = -3 b = 3; e. нормальное распределение со...
C# TabControl скроллинг
Здравствуйте. На TabControl есть длинный TabPage, который сворачивается с появлением полосы прокрутки. Тут все хорошо. В конце TabPage находится GroupBox. Проблема в том, что когда либо наводишь мышкой на groupbox и ждешь, либо нажимаешь на него, скролл сбрасывается в нуль. Т.е. я оказываюсь в начале страницы, и приходится опять опускаться вниз и повторять те же действия. Как это исправить? ...
C# Исправьте ошибку в алгоритме При запуске отображается вместо нуля другое число. То есть не правильно считается общее кол-во пройденных пикселей. https://www.cyberforum.ru/ windows-forms/ thread1557844.html C# Не адкватная реакция кнопки на нажатие https://www.cyberforum.ru/ windows-forms/ thread1557795.html
Суть проста. Надо сделать лабу и в ней "отработать документ". Т.е. сделать эдакую прогу представление документа. Я уже всё сделал и всё такое. И вдруг обнаружил, что на 3 из 3 вызываемых форм у меня галюны какие-то. Если нажимать первые 2 кнопки, то дочерняя форма закрывается! Так не должно быть! Они текст должны показывать! А если на 3 кнопку жать, то показывается текст- так и надо. Почему...
C# Избегание зависания при отправке почты
Тема решена.
C# Настроить взаимодействие происходящего на экране с окружающим миром наткнулся на такое прикольное видео, cut может кто знает как можно сделать похожее ?? заранее спасибо! https://www.cyberforum.ru/ windows-forms/ thread1557762.html
Эксперт .NETАвтор FAQ
10410 / 5140 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
21.10.2015, 17:47  [ТС] 0

Архитектура ПО в WinForms (FAQ & HowTo) - C# - Ответ 8225220

21.10.2015, 17:47. Показов 169502. Ответов 12
Метки (Все метки)

Ответ

Использование UserControl

UserControl – лучшее решение для реализации интерфейсов в WinForms. Пользовательский контрол позволяет разбить GUI на независимые части, где каждый UserControl отвечает только за отображение одного объекта модели данных. Код в таком случае становится более простым, лаконичным и однородным.

Также:
  1. Использование UserControl позволяет повторно использовать код. Однажды написанный UserControl вы можете использовать во многих формах, внутри других UserControl, а также в других проектах.
  2. Вы можете отображать на форме несколько объектов одного класса – просто создав на форме необходимое число UserControl.
  3. Если модель данных меняется, вам достаточно исправить один UserControl, отвечающий за отображения измененного объекта. Код форм, и остальных контролов – останется неизменным.
  4. Распределить работу между разработчиками.
  5. Проектирование форм становится более простым. На форму кидаются несколько UserControl и код формы сводится только к обработке событий этих котролов и перенаправлении данных с одних контролов к другим. При этом вы легко можете добавлять и убирать крупные блоки интерфейса, менять их расположение, выравнивание и т.д.

Начинающие программисты редко используют UserControl, видимо считая их сложными. На самом деле создание UserControl ничем не отличается от создания новой формы. Разница лишь в том, что форма может быть открыта в виде отдельного окна, а контрол – нужно положить на другую форму.

Практическая реализация

Пусть нам нужно отобразить объект данных класса Data. Наиболее простой вариант пользовательского контрола может быть таким:
Пример
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    public partial class DataPanel : UserControl
    {
        // Свойство, хранящее отображаемый объект модели данных
        public Data Data { get; private set; }
 
        //Конструктор
        public DataPanel()
        {
            InitializeComponent();
        }
 
        //Занесение данных из Data в контролы
        public void Build(Data data)
        {
            Data = data;
 
            //здесь занесение полей Data в контролы
            //например:
            //tbName.Text = Data.Name;
        }
 
        //Занесение данных из контролов в Data
        public void UpdateData()
        {
            //здесь занесение значений контролов в поля Data
            //например:
            //Data.Name = tbName.Text;
        }
    }

Код содержит свойство Data, хранящее редактируемый объект, и два метода: Build(Data data) и UpdateData(). Первый из них – заносит данные из Data в контролы. Второй – наоборот – заносит данные из контролов в объект Data. Оба метода, и свойство – публичные, и могут вызываться извне.

Для использования этого UserControl, нужно разместить его на форме и в определенный момент вызвать метод Build(), передав ему объект для отображения (например после того, как пользователь кликнул на элемент в списке объектов). На событие Validating контрола – создать обработчик такого вида:
Пример
C#
1
2
3
4
5
6
7
8
9
10
11
        private void pnData_Validating(object sender, System.ComponentModel.CancelEventArgs e)
        {
            try
            {
                //применяем изменения к объекту модели данных
                (sender as DataPanel).UpdateData();
            }catch(Exception ex)
            {
                e.Cancel = true;//запрещаем покидать контрол, пока не будут введены правильные значения
            }
        }

Этот код будет заносить изменения в объект при выходе пользователя из UserControl. Возможен другой вариант – с кнопкой Apply/Save/Ok. Тогда нужно вызвать метод UpdateData из обработчика нажатия кнопки.

Примеры UserControl смотрите также в главе "Как сделать панель свойств" и в упражнениях к этой главе.

Замечания

1) Обрабатывать ошибки ввода (try/catch) можно и непосредственно внутри метода UpdateData(). Но в таком случае, метод должен возвращать bool сигнализирующий о том, что метод отработан удачно.

2) Для оповещения об изменениях в объекте в UserControl можно сделать событие DataChanged.

3) Обратите внимание, что созданный UserControl появляется в Toolbox VisualStudio только после того как приложение было скомпилировано.

4) Не передавайте объект данных в конструктор UserControl. Во-первых потому что один контрол может быть использован для редактирования нескольких разных объектов, а во-вторых, обновление контрола может быть вызвано несколько раз даже для одного и того же объекта. Кроме того, если ваш конструктор будет иметь параметры, вы не сможете редактировать его в дизайнере форм.

Advanced features

Часто бывает нужно изменять свойства объекта сразу после внесения изменений (например, менять свойство объекта непосредственно в процессе набора текста в TextBox).
Тогда можно реализовать следующую схему:
Пример
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
    public partial class DataPanel : UserControl
    {
        // Свойство, хранящее отображаемый объект модели данных
        public Data Data { get; private set; }
        //событие изменения данных
        public event EventHandler DataChanged = delegate { };
        //счетчик режима обновления
        private int updating;
 
        public DataPanel()
        {
            InitializeComponent();
        }
 
        //Инициализация контролов, занесение данных из Data в контролы
        public void Build(Data data)
        {
            Data = data;
 
            updating++;//включаем режим обновления
 
            //здесь занесение полей Data в контролы
            //например:
            //tbName.Text = Data.Name;
 
            updating--;//выключаем режим обновления
        }
 
        //Занесение данных из контролов в Data
        public void UpdateData()
        {
            if (updating > 0) return;//мы находимся в режиме обновления, не обрабатываем
 
            //здесь занесение значений контролов в поля Data
            //например:
            //Data.Name = tbName.Text;
 
            //здесь также можно вызвать Build(), если нужно перестроить все контролы для новых данных:
            //Build(Data);
 
            //сигнализируем об изменении объекта
            OnDataChanged();
        }
 
        protected virtual void OnDataChanged()
        {
            //вызываем событие
            DataChanged(this, EventArgs.Empty);
        }
 
 
        //обработчик изменения текста TextBox
        private void tbName_TextChanged(object sender, EventArgs e)
        {
            UpdateData();
        }
    }

Счетчик updating используется для предотвращения зацикливания программы при обновлении данных в контролах.

Упражнение 1

Создайте приложение, которое считывает все картинки из папки Изображения (используйте метод Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)), отображает на форме все картинки, рядом с каждой картинкой выводится имя файла, и размер файла. Имя файла можно менять, соответствующий файл должен переименовываться.
Общий вид приложения:
Архитектура ПО в WinForms (FAQ & HowTo)

Решение: Example8.zip

Упражнение 2

Создайте приложение для расчета напряжения по известным значениям сопротивления и силы тока (Закон Ома: U = IR). Интерфейс программы должен позволять производить одновременный расчет для трех наборов параметров. Также программа должна вычислять и отображать суммарное напряжение для всех наборов данных (U = U1 + U2 + U3).
Запретить ввод сопротивления меньше 0.
Общий вид приложения:
Архитектура ПО в WinForms (FAQ & HowTo)

Решение: Example9.zip

Упражнение 3

Если вы реализовали Упражнение 2 с моделью Rich, то переделайте его на модель Anemic. Если у вас была модель Anemic (ну а вдруг)), то переделайте на модель Rich.
(Что такое Rich и Anemic смотрите в главе "Как разработать модель данных?")
Решение для Anemic: Example10.zip
Решение для Rich преведено в предыдущем упражнении.


Вернуться к обсуждению:
Архитектура ПО в WinForms (FAQ & HowTo) C#
45
Заказать работу у эксперта
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.10.2015, 17:47
Готовые ответы и решения:

query='SELECT * FROM resume WHERE ' & ''' & RecSet('place')& ''' & '=' & '''& s_loc &''' & - что не так?
упростил для краткости запрос. в чем ошибка? RecSet - это коннекшн. query='SELECT * FROM resume...

MVVM & WinForms
у меня есть проект wpf, в котором в главное окно подгружаются юзер контролы, в зависимости от...

error '80020009' Îøèáêà. /lalala/profile.asp, line 28
При простейшем и сто раз работавшем скрипте, вылетает ошибка! след. содержания error...

Помогите найти драйвера для pci\ven_8086&DEV_266E&SUBSYS_A002145&REV_05\3&13C0B0C5&0&F2
pci\ven_8086&DEV_266E&SUBSYS_A002145&REV_05\3&13C0B0C5&0&F2 Мультимедиа аудиоконтроллер ...

12
21.10.2015, 17:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.10.2015, 17:47
Помогаю со студенческими работами здесь

немогу найти драйвера на PCI\VEN_1039&DEV_7012&SUBSYS_810D1043&REV_A0\3&61AAA01&0&17
Мультимедиа аудиоконтроллер PCI\VEN_1039&DEV_7012&SUBSYS_810D1043&REV_A0\3&61AAA01&0&17

Нужен драйвера, код PCI\VEN_1039&DEV_7012&SUBSYS_0C98105B&REV_A0\3&B1BFB68&0&17
всем привет !! уменя нет звука нужен драйвер код...

Мультимедиа контролер PCI\VEN_14F1&DEV_8800&SUBSYS_EA3D14F1&REV_05\4&25700A26&0&3020
Помогите пожалуйста найти драйвер на мультимедиа видеоконтролер ...

Драйвера на PCI\VEN_10B7&DEV_1700&SUBSYS_80EB1043&REV_12\4&2E98101C&0&28 F0
помогите плиз - вот ID: PCI\VEN_10B7&DEV_1700&SUBSYS_80EB1043&REV_12\4&2E98101C&0&28F0 ...

0
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru