Как сделать собственный составной элемент управления (composite control) в WinForms

Задача: сделать нестандартный элемент управления (control) для Windows Froms. Какой именно? Есть несколько разных вариантов, темой этой статьи будет собственный DateTimePicker, способный работать с пустыми датами. В качестве пустых дат будет активно использоваться описанный ранее класс DatePlus. Что мы хотим? По сути дела нам нужен Masked TextBox под ввод даты, кнопка для вызова всплывающего календаря и ряд служебных функций - упакованные в одну простую оболочку. Плюс на кнопке должна быть стрелка, разворачивающаяся вверх или вниз в зависимости от наличия календаря.

Добрый MSDN говорит, что нестандартные управляторы бывают трех типов:

- составные (composite), совмещающие несколько уже существующих, делаются наследованеим от UserControl
- расширенные, добавляющие что-то новое в существующий control, делаются наследованием от соотвествующего класса
- нестандартные (custom), в которых переделывается отрисовка на экран
Читать далее

Как отсортировать данные в DataTable

Простой и быстрый способ сортировки DataTable - использовать свойство DataView.Sort (у любой DataTable всегда есть DataTable.DefaultView и при привязке таблицы как источника данных на самом деле будет использоваться именно это DataView)

_someDataView.Sort = "COLUMN_ONE DESC, COLUMN_TWO DESC";
// или
_someDataTable.DefaultView.Sort = "COLUMN_ONE DESC, COLUMN_TWO DESC";

Аналог DataView для List и BindingList

Начитавшемуся умных книг программисту-новичку могут придти в голову странные идеи. Например заменить стандартные DataTable собственными классами, обьединив их в списки List<T>. Пойдя на это программист моментально сталкивается с целым рядом проблем. Прежде всего обычный List в отличие от DataTable не поддерживает автоматическое обновление данных в связанных с ним элементах интерфейса. Преодолеть это можно использованием класса BindingList<T> из пространства имен System.ComponentModel.
Читать далее

Пустая дата в C# - часть 1, собственный класс даты

Стандартный класс DateTime создает массу проблем в повседневной работе из-за того, что он не поддерживает пустых значений. На практике существует масса ситуаций, в которых дата чего бы то ни было неизвестна и именно этот факт надо обрабатывать и отображать на экране, а не некое минимально значение. На уровне базы данных дело обстоит проще - в любой колонке может быть значение null. Стандартный DateTime в C# вообще не может быть равен null. Но даже если мы используем введенную в .net 2.0 обертку Nullable<T> и таки приравняем дату к null, мы все равно не сможем с ней нормально работать. Почему?

- при выводе на экран для пустой даты надо выводить пустую строку
- при вводе даты ее надо проверять на корректность, причем пустая дата будет правильной
- надо сравнивать даты и сортировать их
- при записи и чтении из базы данные мы будем получать пустые даты не в виде null, а в виде DBNull.Value
- надо проверять, не находится ли дата в будущем
Читать далее

Простой способ передать функцию как аргумент в C# - делегат Action<T>

Если вы еще не готовы погружаться в глубины функционального программирования (возможности которого замечательно описаны здесь) или просто ищете максимально простой способ передать одну функцию в виде аргумента в другую функцию, вам идеально подойдет делегат Action<T>.

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

Как выключить вкладку в TabControl

В стандартном TabControl полностью выключить вкладку невозможно. В лучшем случае можно выключить ее содержимое, например так

 ((Control)_someTabControl.TabPages[0]).Enabled = false;

но чтобы выключить саму вкладку - ее заголовок в перечне - придется переделывать сам TabControl или воспользоваться плодами чужой работы (что может быть приятнее?).

Я использую TabControlEX , сделанный аж в 2005 году и свободно распространяемый под лицензией MIT.

Если же вам все-таки понадобится выключение всего содержимого вкладки (в том числе отдельно от выключения самой вкладки), то можно использовать следующую функцию
Читать далее

Полезные расширения-плагины для WordPress

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

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

TRUEedit - позволяет изменить шрифт и размер текста во встроенном редакторе записей в режиме HTML, остальные возможности я пока не использую - по идее там можно отключить некоторые автоматические действия WordPress по отношению к вашему коду. Я просто наслаждаюсь Helvetica c 11 размером вместо крошечных букв по умолчанию.

Ascending Posts Plugin - позволяет внутри конкретной рубрики - например книги или большого фотоотчета - сортировать записи по возрастани даты, вместо стандартного убывания - то есть в начале будут самые старые записи.

SyntaxHighlighter Evolved - для программистов. Красивая подсветка синтаксиса в примерах кода. Именно его использую на этом сайте.
Читать далее

WordPress/php - ошибка failed to open stream: Permission denied

Ошибка очень простая и схватывают ее обычно новички из мира Windows, настраивающие свой первый-второй Wordpres. Например при использовании встроенных функций вроде обновления самого WordPress. Собственно все прямо сказано - нет прав на доступ к какому-нибудь файлу. Решается это в панели управления вашим хостингом/сервером - кроме очевидных прав на запись нельзя забывать, что у каждого файла или папки есть свой пользователь-владелец, и если владельцем index.php является root, а вордпресс работает от имени pupkin, то надо сделать pupkin владельцем и файлов и папок.

Краткая, неполная и по большей части неправильная история языков программирования

1801 - С помощью ткацкого станка и перфокарт Жозеф Мари Жаккар выводит "привет мир!" на ткани. Современники не впечатлены: нет хвостовой рекурсии, параллелизма и заглавных букв.

1842 - Ада Лавлейс пишет первую программу. Ее работу осложняет одна маленькая неприятность: отсутствие компьютеров, на которых можно было бы запустить код. Позже ее методикой воспользуются архитекторы уровня предприятия , программирующие на UML.

1936 - Алан Тьюринг изобретает все языки программирования, которые когда-либо появятся, но не успевает запатентовать: его вербует английская разведка и превращает в агента 007.
Читать далее