|
|
Другие темы раздела | |
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 |
21.10.2015, 17:57 [ТС] | 0 | |||||||||||||||||||||||||||||||||||||||||||||
Архитектура ПО в WinForms (FAQ & HowTo) - C# - Ответ 822524321.10.2015, 17:57. Показов 169324. Ответов 12
Метки (Все метки)
Ответ
Именование контролов
Давайте контролам осмысленные названия, отражающие суть действия или имя объекта, которые они хранят. Не оставляйте названия типа button1 или textbox1. Имена кнопок должны отражать имя действия, которое выполнится при нажатии на кнопку: btSave – для операции сохранения, btOpen – для открытия, btCancel, btOk, btAdd, btDelete и т.д. Имя кнопки уже полностью говорит о том действии, которая она выполняет. Когда вы создадите обработчик нажатия на кнопку, его название будет btOpen_Click() – по одному названия понятно, что здесь должно быть открытие документа. Префикс bt – нужен для обозначения того, что это является кнопкой. Некоторые другие префиксы: tb – для TextBox, RichTextBox, cb - для ComboBox, CheckBox, dgv – для DataGridView, lv - для ListView, mi – для MenuItem, rb – для RadioButton, pn – для Panel, UserControl, lb – для Label, ToolStripStatusLabel, pb – для PictureBox. Имена текстовых полей должно совпадать с именем объекта, которые они хранят: tbName – хранит имя, tbAge – хранит возраст, tbCount, tbPosition и т.д. Аналогично – другие типы контролов: cbSex – комбобокс выбора пола, lvFiles – ListView хранящий список файлов, dgvClients – DataGridView хранящий список клиентов и т.д. Бывает так, что контрол не привязан к какому либо конкретному объекту или ему трудно дать осмысленное название. Например – главное меню, статус бар, закладки, таймеры. В таком случае можно дать название Main. Например: msMain – главное меню (MenuStrip), ssMain – статус бар (StatusStrip), tmMain – таймер (Timer), tcMain – закладки (TabControl), tvMain – дерево (TreeView) и т.д. Если контрол хранит одно значение (это TextBox, ComboBox, CheckBox, RadioButton, Panel) – давайте имя в единственном числе, если же контрол хранит список (это DataGridView, ListView, ListBox, TabControl)– давайте имя во множественном числе. Что касается контролов типа Label. Если вы не планируете каким либо образом обращаться к этим контролам из кода, то для них можно оставить исходное имя (label1, label2 и т.д). Если же вам нужно менять текст лейбы из кода – обязательно дайте осмысленное название. Аналогично можно оставить исходное название для тех контролов, к которым обычно не обращаются из кода, и у них нет обработчиков – например Splitter. Используйте для названий английские слова, в правильном числе и времени. Не используйте кириллицу или транслит. Имена классов для форм, UserControl и кастомных контролов Дайте главной форме имя MainForm. Если вы создаете еще несколько дополнительных форм, называйте их XxxForm. Например: ClientsForm – форма, отображающая список клиентов, PrintForm – форма печати, LoginForm – форма логина и т.д. Аналогично для имен классов UserControl – давайте имена типа XxxPanel. Например ClientPanel – панель редактирования клиента, DocumentPanel – панель для отображения документа и т.д. Если вы создаете кастомный контрол, используйте постфикс, совпадающий с классом от которого вы унаследовались. Например, если вы сделали свою кнопку унаследованную от Button, то имя класса должно быть XxxButton (например FlatButton или CheckButton). Имена для динамически создаваемых контролов Если вы создаете контрол как локальную переменную и не планируете хранить его как поле класса, то используйте просто префикс (bt, pn, tm) – для контролов и form – для форм. Например, если вам нужно создать и открыть форму логина, пишите так:
Пояснения
1) Осмысленные имена контролов облегчают написание и понимание кода. Ваш код не должен содержать фрагменты типа textBox12.Text или button2_Click() – они бессмысленны, из их названия невозможно определить что они делают. 2) Давайте осмысленные имена сразу, еще до того, как вы сделаете обработчики событий. Поскольку если вы сделали обработчик button1_Click(), то даже если вы переименуете button1 на btOpen, имя обработчика все равно останется button1_Click(). 3) Префиксы нужны для того, что бы вы легко отличали имена контролов от имен переменных, хранящих данные. Если не использовать префиксы, то часто имена контролов будут совпадать с именами объектов модели данных, переменными и т.д. Например, если у вас есть список людей, то у вас в коде будет встречаться и Persons(имя класса) и persons (объект типа Persons, хранящий список) и person(локальная переменная хранящая конкретного человека). Если же вы еще и DataGridView отображающий список, назовете Persons, то наступит полная неразбериха в именах. Если же ваш DataGridView будет называться dgvPersons – сразу будет понятно, что это контрол. 4) Не стоит указывать префиксы, абсолютно точно указывающие на тип контрола. Префиксу достаточно просто указать примерный функционал. Например и TextBox и RichTextBox могут иметь префикс tb. В процессе разработки типы контролов часто меняются. Вместо TextBox, возможно вы захотите использовать RichTextBox, вместо Panel - GroupBox, вместо Label - ToolStripStatusLabel и т.д. Если каждый раз давать другой префикс – код будет слишком часто меняться, и этого делать не стоит. 5) Если вы сделали свой UserControl, давайте ему префикс pn. По сути, любой контейнер (Panel, GroupBox, UserControl) – является панелью. Не нужно придумывать префиксы для каждого вновь созданного UserControl, это будет запутывать код. 6) Если у вас получается несколько одноименных контролов (например два TabControl, которые должны иметь имя tcMain) – значит интерфейс переусложнен и стоит задуматься о разделении элементов интерфейса на несколько независимых UserControl. 7) Не стоит придумывать имена для динамических контролов и заносить их в свойство Name контрола. Это имя не нужно для работы контрола. Оно может потребоваться только если вы хотите делать поиск контролов на форме по имени заданному как строка. Но это плохой подход к работе с контролами. Если вам нужно создать контрол динамичеки и затем вы хотите обрщаться к нему, то создайте поле в вашей форме и обращайтесь к нему:
Где и как обрабатывать исключения Пишите блок try/catch только в интерфейсе программы - в обработчиках нажатия кнопок или других контролов. Не перехватывайте исключения в теле методов модели данных или бизнес-логики. Не оставляйте блок catch пустым – выводите сообщение пользователю в виде MessageBox.Show(ex.Message). Пояснения
1) Если класс не может самостоятельно решить проблему с исключением, он не должен его обрабатывать. Обработка такого исключения – является просто замалчиванием проблемы. Например, если уровень DAL не может отправить данные в БД и просто отловил исключение, то вышестоящие уровни (в том числе GUI и пользователь) будут уверены, что данные отправились. Что недопустимо. Если же класс не перехватил исключение, оно автоматически будет пробрасываться вверх, вышестоящему слою. А самым вышестоящим слоем является GUI. Здесь исключение нужно перехватить и сообщать о нем пользователю. Неперехват исключения в GUI означает аварийное закрытие приложения. 2) Если у вас серверное приложение – исключение может быть отловлено самым вышестоящим слоем и отправлено пользователю по сети. 3) Перехват внутри классов модели возможен, если класс, который его перехватывает, может исправить ситуацию, либо исключение является частью логики программы. Заметьте также, что механизм исключений в C# является очень медленным и использовать исключения для логики программы – не рекомендуется. Пример
Антипример (так делать нельзя!)
Упражнение
Напишите правильную реализацию метода из антипримера. Решение
Все исключения пробрасываются в вызывающий уровень:
Advanced features
1) Довольно утомительно в каждом обработчике писать однотипный код try{…}catch(Exception ex){ MessageBox.Show(ex.Message);}. Для того что бы облегчить себе жизнь, можно обрабатывать событие Application.ThreadException, в котором показывать пользователю сообщение об ошибке. После обработки данного события, главный поток вернет управление в форму и приложение продолжит работу. Для срабатывания этого события не забывайте предварительно вызвать Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); в методе Main() из Program.cs. 2) Часто исключения обернуты друг в друга и содержатся в свойстве Exception.InnerException. В таком случае имеет смысл показывать пользователю самый глубокий Exception, именно тот, который содержит изначальную причину:
4) Не используйте генерацию исключения для выхода из приложения (например при неправильно введенном пароле). Исключение не всегда приводит к завершению приложения: может быть выдано окно в котором будет кнопка "Продолжить" и пользователь сможет продолжить работу в программе. А как же обрабатывать исключения в потоках? Отловите исключение с помощью try/catch в главном методе потока. В обработчике catch вызовите некий метод формы для информирования пользователя о проблеме. Пояснения
1) Не UI потоки не могут пробросить исключение в главный GUI поток приложения. Поэтому вы должны отловить исключение в главном методе потока и вызвать метод формы, который сообщит пользователю о проблеме. Поскольку исключение происходит не в главном потоке, то метод формы должен проверять InvokeRequired и делать перевызов себя через Invoke. 2) Вы должны обрабатывать все исключения, кроме ThreadAbortException и AppDomainUnloadedException. Первое возникает при остановке потока через метод Abort() и обрабатывается самим объектом Thread. Второе исключение возникает при выгрузке домена и его тоже обрабатывать не следует. Пример
Advanced features
1) Необработанные исключения в потоках обычно приводят к завершению приложения. Но это поведение можно изменить, если прописать в app.config:
Так делать не рекомендуется, но если очень хочется... Вернуться к обсуждению: Архитектура ПО в WinForms (FAQ & HowTo) C#
42
|
21.10.2015, 17:57 | |
Готовые ответы и решения:
12
query='SELECT * FROM resume WHERE ' & ''' & RecSet('place')& ''' & '=' & '''& s_loc &''' & - что не так? MVVM & WinForms error '80020009' Îøèáêà. /lalala/profile.asp, line 28 Помогите найти драйвера для pci\ven_8086&DEV_266E&SUBSYS_A002145&REV_05\3&13C0B0C5&0&F2 |
21.10.2015, 17:57 | |
21.10.2015, 17:57 | |
Помогаю со студенческими работами здесь
0
немогу найти драйвера на 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 |