Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

№39 рассылки '.Net Собеседник':


Информационный Канал Subscribe.Ru

.Net Собеседник #39

Содержание
  1. От автора
  2. Обзор новостей
  3. Предупреждаем автоматическую регистрацию на веб сайте
  4. Время кода - Очеловечиваем перечисления
  5. Форумы .Net на www.sql.ru

От автора

Здравствуйте, коллеги!

Окончательный анонс второго номера журнала "Алгоритм".
  • Интервью с Алекандром Сибилевым, автором проекта http://www.sql.ru/.
  • К.Коцарь «Что нам стоит мост построить?»
    По закону жанра требуется начинать с какой-нибудь банальной фразы, например: мы живем в стремительно изменяющемся мире. Бесспорно, технологии сменяют друг друга с бешеной скоростью, предлагая немыслимые возможности и быстро устаревая, становясь «немодными» и «неперспективными». Одни ярко вспыхивают, подобно болидам в ночном небе, другие долго держатся на плаву, трансформируясь и развиваясь согласно текущим тенденциям. У разработчиков программного обеспечения голова идет кругом — то, что вчера казалось невозможным, сегодня уже обыденная реальность, а завтрашний день обещает быть еще более светлым и радостным. Мы бросаемся в объятия новейших языков и средств разработки, отбрасывая балласт прошлого, и зачастую не замечаем, что проходим мимо чего-то, пусть не всегда самого важного, но заслуживающего внимания. Почему Microsoft продолжает выпуск Visual FoxPro? Почему у «фокса» так много ярых сторонников и не менее ярых противников? Почему нужно продолжать создавать программы на VFP, если платформа .NET предоставляет более широкие возможности? Почему руководитель команды по разработке Visual FoxPro имеет должность Visual Studio Data Product Manager и пропагандирует новые возможности .NET? Почему нет ответа на вопрос «быть или не быть VFP.NET»? И почему, черт возьми, участь писать эту статью досталась мне? Если вы хотите получить ответы на эти или подобные вопросы, то вам, по всей видимости, стоит подыскать другой источник информации или перейти к следующей статье. В этой же статье я попытаюсь рассказать о взаимодействии между .NET и Visual FoxPro и изложить свою, сугубо субъективную точку зрения на совместное сосуществование двух технологий.
  • В.Чужа «Использование пользовательских функций Microsoft SQL Server 2000 в работе с DataGrid ASP.Net»
    Бывают такие случаи, когда необходимо добавить в существующее приложение, использующее для вывода данных DataGrid, дополнительный столбец. И всё бы ничего, если в ходе разговора не оказывается, что этот столбец является суммой неких значений из таблицы, подчинённой данной. Как можно поступить в таком, на первый взгляд непростом, случае? На помощь приходят пользовательские функции Microsoft SQL Server’a.
  • А.Маркелов «Настройка полнотекстового поиска для MS SQL Server 2000»
    Полнотекстовый поиск предоставляет более мощные возможности для поиска, чем стандартные средства SQL наподобие оператора LIKE. В данной статье рассказывается, как настроить полнотекстовый поиск для MS SQL Server 2000. MS SQL Server 2000 должен быть установлен с опцией "full-text search". В версии MSDE 2000 опция "full-text search" недоступна. Необходимые операции в примере будут осуществляться с помощью команд T-SQL. Так же возможно выполнить их с помощью wizard'a или через соответствующие пункты меню.  
  • Д.Хейс, В.Чужа.Mono переживает бурный коммерческий успех.
    Полная версия.
  • В.Чужа Первый взгляд на Си-омега
    Впервые о Си-омега (Cω) я прочитал в статье, которая называется “Mono переживает бурный коммерческий успех”. А до этого на одном из семинаров, проводимых в учебном центре “Квазар-Микро”, этот язык упоминался представителем Microsoft как перспективная разработка. И вот - более подробная информация и ссылки, ссылки, ссылки.
  • + Информация о компонентах, вышедших за последние 2 месяца и других событиях, касающихся платформы .Net.
На этом всё - желаю интересного чтения.

{К содержанию}

Обзор новостей

  1. Обновился ЖЖ hDrummer'a
    Выложил свой рассказ-впечатление от встречи с одной девушкой. Заходите :)
  2. Вышел плагин CodeXchange VS.NET
    CodeXchange – плагин к Visual Studio.NET, предоставляющий доступ к онлайн хранилищу кодов для платформы .NET.
  3. Вышла бета Nevron User Interface 4.0
    Nevron User Interface Suite 4.0 – набор элементов управления Windows Forms.
  4. DiscountASP.NET запустил хостинг ASP.NET 2.0 Beta
    ASP.NET и SQL провайдер хостнга, DiscountASP.NET, объявила о запуске хостинга приложений ASP.NET 2.0 Beta. Бесплатный тестовый хостинг приложений ASP.NET 2.0 Beta 2 опционально доступен всем клиентам DiscountASP.NET.
  5. Вышел .netCHARTING 3.2 с поддержкой статистики и анализа
    В .netCHARTING 3.2 были добавлены основне финансовые индикаторы, наряду с интегрированным статистическим анализом. А также новый вид графиков, улучшены старые виды графиков, улучшенa поддержка DataEngine. Разработчикам доступна полнофункциональная бесплатная версия.
  6. Вышел Likemedia ClassBuilder 3.6
    Likemedia ClassBuilder (самый лёгкий в использовании генератор кода доступа к данным .NET) теперь содержит поддержку для транзакций БД, а также обработчики типов данных "binary" и "image" SQL Server.
  7. Скоро выйдет Professional Validation And More v3.0
    Professional Validation And More Version 3.0 – набор более чем из 40 элементов управления веб, призванных решать проблемы ввода данных в веб-приложениях.
  8. Borland выпустила Together Suite для .NET
    Together Suite – инструмент моделирования для Visual Studio .NET. Позционируется как мостик между UML моделированием и DSL (Domain Specific Languages).
  9. Вышел SQL Server 2005 April CTP
    Microsoft выпустила April Community Technology Preview SQL Server 2005.
  10. Вышла Visual Studio 2005 Beta 2
    Microsoft выпустила Beta 2 инструмента Visual Studio 2005, включая Visual Studio Team Suite.

{К содержанию}

Статья номера

Предупреждаем автоматическую регистрацию на веб сайте

ЯЗЫК: C#
Автор статьи: Bipin Joshi

ПЕРЕВОД: Чужа В.Ф. ака hDrummer
КОД К СТАТЬЕ: Качаем здесь

Вступление

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

GDI+ и класс Random

Классы GDI+ позволяют вам легко генерировать графику на лету и отображать её на веб-страницах. Мы будем использовать такие классы наряду с классом Random для разработки нашего решения.

Генерируем случайные строки

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

public static string GetRandomString(int length)
{
int intZero=0, intNine=0, intA=0, intZ=0, 
intCount=0, intRandomNumber=0;
string strRandomString;
Random rRandom =new Random(System.DateTime.Now.Millisecond);
intZero = '0';
intNine = '9';
intA = 'A';
intZ = 'Z';

strRandomString = "";
while (intCount <  length)
{
intRandomNumber = rRandom.Next(intZero, intZ);
if(((intRandomNumber >= intZero) && 
(intRandomNumber <= intNine) || 
(intRandomNumber >= intA) && (intRandomNumber <= intZ)))
{
strRandomString = strRandomString + (char)intRandomNumber;
intCount = intCount + 1;
}
}
return strRandomString;
}

Функция принимает длину строки как параметр и генерирует её с помощью класса Random. Логику построения такой функции мы рассматривать не будем, поскольку она ясна и прозрачна.
Эта функция также размещена в файле RandomString.cs, который доступен для скачивания.

Генерируем изображение и выводим его на лету

Теперь сгенерируем изображение и выведем его.

Bitmap bmp=new Bitmap(100,30);
Graphics g=Graphics.FromImage(bmp);
g.Clear(Color.Navy);
string randomString=preventautopost.RandomString.GetRandomString(6);
Session["randomstring"]=randomString;
g.DrawString(randomString,new Font("Courier",16),
new SolidBrush(Color.WhiteSmoke),2,2);

Здесь мы создаём объект класса Graphics из Image (представленный классом Bitmap). Затем мы рисуем на нём случайно сгенерированную строку и сохраняем картинку в Response.
Этот код находится в файле randomimagepage.aspx.

Строим регистрационную форму

Наконец, разработаем регистрационную форму, на которой будет отображаться случайно сгенерированное изображение в элементе управления Image. Код смотрим в файле registrationform.aspx, доступном для скачивания. Одна важная строка в веб-форме:

<asp:Image id=Image1 runat="server" ImageUrl="randomimagepage.aspx" />

Обратите внимание, каким образом установлено свойство ImageUrl - в предыдущую веб-форму, которая динамически создаёт картинку и отправляет её в поток отзыва. Как только пользователь отправил форму, мы проверяем введенную им строку на соответствие с тем, что было сгенерировано.

string str=(string)Session["randomstring"];
if(str!=TextBox4.Text)
{
Label5.Text="Random string verification failed!";
}
else
{
Label5.Text="Проверка удачна!";
//работаем здесь с БД по регистрации нового пользователя
}

Итого

В этой статье мы привели пример борьбы с автоматической регистрацией пользователей в ASP.Net приложении с использованием классов GDI+ и класса Random.

{К содержанию}

Время кода

Очеловечиваем перечисления

ЯЗЫК: C#
Автор статьи: Alex Kolesnichenko

ПЕРЕВОД: Чужа В.Ф. ака hDrummer
КОД К СТАТЬЕ: HumanizingTheEnumerations_Source.zip ~16 KB

Вступление

Предположим, что у вас есть перечисление enum, отражающее состояние счёта на покупку во вселенной вашего приложения:

public enum PurchaseOrderStatus
{
    Opened,
    Consulting,
    InProgress,
    Finalizing,
    Closed,
    Canceled
}

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

Атрибуты и Отражение - в дело!

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

public enum PurchaseOrderStatus
{
    Opened,
    Consulting,
    InProgress,
    [HumanReadable("PO_Finalizing")]Finalizing,
    Closed,
    Canceled
}

Вроде бы ничего не изменилось. Кроме того, что был добавлен атрибут HumanReadable. Но код-помощник, который будет описан ниже, предполагает, что у вас есть строки с кодами PurchaseOrderStatus.Opened, PurchaseOrderStatus.Consulting и т.д., а PO_Finalizing в вашем файле ресурсов потом, посредством использования отражения, заменится на понятную человеку информацию.

Итак, действуем таким образом: определяем ваш enum; добавляем строки с идентификаторами в вашем enum к вашему файлу ресурсов; если уже есть строки с такими кодами, перегружаем код атрибутом HumanReadable; используем класс-помощник для конвертации вашего enum в человекопонятную информацию для элементов управления, работающих с данными.
Начиная со второй версии, вам можно и не добавлять строки в файл ресурсов, а всё хранить прямо в атрибутах. Это можно делать, если приложение создаётся для внутренних нужд и не планируется для перевода на другие языки. Однако это нерекомендуемая практика.

public enum PurchaseOrderStatus
{
    [HumanReadable("Just Opened")]Opened,
    [HumanReadable("Consulting with Our Partners")]Consulting,
    [HumanReadable("Still in Progress")]InProgress,
    [HumanReadable("Almost There")]Finalizing,
    [HumanReadable("Closed the Deal!")]Closed,
    [HumanReadable("Oops, Canceled")]Canceled
}

Этот подход не использует стандартный атрибут Description. Целью существования атрибута Description является отображение детального описания метода/свойства/события/чего-то ещё в дизайнере IDE designer, так что лучше оставить его для того, для чего он предназначен и не взваливать на него дополнительные задачи.

Что теперь?

А теперь вызовем метод класса-помощника - для того, чтобы привязать значения перечисления к строкам, загруженным из файла ресурсов:

// где-то в коде инициализации формы...

ComboBox purchaseOrderStatus;

...

// Это можно установить из IDE
purchaseOrderStatus.DisplayMember = "HumanReadableName";
purchaseOrderStatus.ValueMemeber = "Value";
//-

purchaseOrderStatus.DataSource = 
    EnumToHumanReadableConverter.Convert(typeof(PurchaseOrderStatus), 
    YourResourceManager);

Как это работает?

Метод EnumToHumanReadableConverter.Convert получает идентификатор строки из перечисления с использованием отражения и возвращает объект класса ArrayList, содержащий пару HumanReadableName - Value. ComboBox путём использования своего свойства DataSource получает этот список и использует свойства DisplayMember и ValueMember для того. чтобы решить, что отображать, а что вернуть как SelectedValue.

public class HumanReadablePair
{
    public object Value
    {
        get;
        set;
    }

    public string HumanReadableName
    {
        get;
        set;
    }
}

Фактически, свойства DisplayMember и ValueMember можно установить из IDE, а в коде только устанавливать свойство DataSource.
Для выбора правильного значения в элементе управления, можно использовать такой код:

purchaseOrderStatus.SelectedValue = PurchaseOrderStatus.Finalizing;

Следующий код получит состояние выбранного Purchase Order из ComboBox:

PurchaseOrderStatus selected = (PurchaseOrderStatus)purchaseOrderStatus.SelectedValue;

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

ResourceManager YourResourceManager =  new ResourceManager("HumanizingTheEnumerations.Strings", Assembly.GetExecutingAssembly());

И ещё раз, код, который отобразит значения enum в ComboBox:

purchaseOrderStatus.DataSource =  EnumToHumanReadableConverter.Convert(typeof(PurchaseOrderStatus), YourResourceManager);

Если вы не планируете локализовать пользовательский интерфейс вашего приложения, можно использовать более простую версию метода Convert:

purchaseOrderStatus.DataSource = EnumToHumanReadableConverter.Convert(typeof(PurchaseOrderStatus));

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

labelTest.Text = EnumToHumanReadableConverter.StringFor(InvoiceStatus.Processing, 
    YourResourceManager);

или

labelTest.Text =  EnumToHumanReadableConverter.StringFor(InvoiceStatus.Processing);

Всё, что необходимо для использования описанного подхода, есть в файле HumanReadableAttribute.cs, ссылка на который есть в статье.

Вот и всё.


{К содержанию}

Форумы .Net - вопросы оставшиеся без ответа

viewstate
Функция вывода на печать... (ASP)
javascript: fromCharCode разное поведение
цифровая подпись клиента
тип ошибки (0x800CC810)
Вопрос про объекты ActiveDirectory
Рамка выделения внутри дочернего окна
Соединение Visual Studio к Palm'у
Поведение курсора в CustomDataGridColumnStyle
Узнать число полученных записей в Датасете, если курсор на стороне сервера


На этом тридцать девятый .Net Собеседника закончен.
До следующего номера.



Чужа Виталий Ф. aka hDrummer, MCAD, MCDBA, MCP
hdrummer@sql.ru - жду ваши предложения и замечания.



http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.dotnetgrains
Отписаться

В избранное