вторник, 16 ноября 2010 г.

CollectionEditor: валидация уникальных элементов

PropertyGrid - очень удобная штука. Однако же, встроенные редакторы коллекций то ли недоделаны, то ли просто не предназначены по задумке для расширений. Мне потребовалось реализовать валидацию уникальных элементов коллекции в CollectionEditor, нашел вариант со StackOverflow, однако глючный и, похоже, непроверенный.

Пришлось писать свой.

суббота, 13 ноября 2010 г.

Linq-to-Regex

Думал про нестандартные использования Linq (НЕ Linq-to-<источник данных>). В процессе, исходя из логических умозаключений, набрал в гугле фразу "linq-to-regex". Раньше никогда про него не слышал, не знал, не видел, не думал, что оно такое есть...

Но Linq-to-Regex должен был существовать, по следующим причинам:
1. Регулярное выражение, особенно не банальное [A-Za-z0-9]+ - штука довольно сложная для визуального восприятия.
2. Regex'ы - это идеальное вместилище для труднопрогнозируемых ошибок из серии "очепятка". А шарп по своей идеологии категорически не должен такое разрешать.
3. Regex'ы как класс реализованы в C# и .Net отвратительно, совершенно не встроены в язык, поддерживают очень мало полезных фишек... И несмотря на то, что я обожаю перл, и обожаю перловые регексы, и нет, наверное, ни одного скрипта на перле, где бы я их не использовал - несмотря на всё это, за все те 3 года, которые я пишу на C#, я юзал шарповые Regex'ы ну может раз 5-6 (причем, чаще всего в валидаторах, и регексы чаще всего были крайне примитивными)...

четверг, 4 ноября 2010 г.

Автоматический merge файлов во время установки


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

Я бы предпочел такое решение сделать в виде онлайн веб-сайта, но с командиром не поспоришь. Сказал WinForms - будет тебе WinForms. И WiX - заодно!

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

среда, 3 ноября 2010 г.

Рекурсия Linq'ом

Задача рекурсивного обхода встает очень часто. Например, в SharePoint'е, я сталкивался с этим при рекурсивном добавлении пунктов меню и при удалении пунктов меню с флагом IsExternal (про это есть отдельный пост, "Локализация меню SharePoint 2010"); любые деревообразные контролы типа TreeView также частенько этого требуют, ну да и без всяких контролов, любые вложенные объекты рано или поздно требуют рекурсии или аналогичной по смыслу операции.

Раньше как-то не задумывался, что это можно реализовать на Linq'е. А ведь оказывается, простейший Extension Method эту проблему решает. Например, потребовалось подписать на событие MouseDown все вложенные контролы некой формы, код в таком случае будет выглядеть примерно так:
foreach(Control c in this.Controls.WithDescendants(c => c.Controls))
{
    c.MouseDown += new EventHandler<MouseEventArgs>(Controls_MouseDown);
}