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

В двадцать девтом выпуске рассылки '.Net Собеседник' вы можете прочесть обзор новых компонент и продуктов, разработанных с использованием платформы .Net, больше узнать о выражениях, использующихся для привязки к данным,


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

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

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

От автора

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

В С#, как и во многих других языках, есть встроенный тип перечислений. В работе с ним есть и свои особенности. В частности, мы можем указывать какой числовой тип используется «за кулисами перечисления». Также с помощью метода Format мы можем выводить переменные типа enum в разных видах – строковом, числовом, шестнадцатиричном. Интересны два подхода к приведению строкового или числового значения к перечислению, их можно использовать в веб-приложениях при передаче числовых/строковых параметров на другую страницу.

using System;

namespace hDrummer.Enum2
{

class Starter
{
enum Months : byte {Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec}

[STAThread]
static void Main()
{
Months m = Months.Feb;
// Выводим в виде строки
Console.WriteLine(m.ToString());
// выводим в виде числа, можно также использовать g(G) для вывода в виде строки и x(X) - в шестнадцатиричном виде
Console.WriteLine(Enum.Format(typeof(Months), m, "d"));
// приводим строковое значение к перечислению
m = (Months) Enum.Parse(typeof(Months), "Jan");
// можно и так
m = (Months)0;
Console.WriteLine(m.ToString());
}
}
}
//Вывод на экране
//Feb
//1
//Jan

На этом всё - желаю интересного чтения.

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

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

  1. Вышел NDoc 1.3
    Ndoc – инструмент генерации документации с наращиваемым API, предназначенный для разработчиков .NET. В новой версии пофиксено множество ошибок, а также добавлено новых возможностей.
  2. VersionOne объявила о выходе новой версии инструмента v1.5 Agile Development Management
    VersionOne выпустила последнюю версию базированного на платформе Microsoft .NET инструмента для быстрого планирования и управления. Последний выпуск ПО от VersionOne включает поддержку для нескольких методологий быстрого планирования, включая Extreme Programming (XP), Scrum, Dynamic Systems Development Method (DSDM) и AgileUP.
  3. Вышел набор API для интеграции с Outlook 2003
    Microsoft выпустила в народ API, ранее предназначавшееся только для внутреннего использования – для создания приложений, работающих с Microsoft Outlook. В API реализовано управления учётными записями, состоянием соединения, занят/свободен, конверсией MAPI-MIME, и управлением хранилищем Outlook. Документация по API есть только для Outlook 2003 SP1.
  4. Членство, роли и профили ASP.NET 2.0 в ASP.NET 1.1
    Microsoft выпустила прототип компонента для ASP.NET 1.1, содержащий функциональность для членства(Membership), ролей (Roles) и профилей (Profiles), которые появятся в ASP.NET 2.0. Позиционируемое как временное решение в качестве облегчения миграции на ASP.NET 2.0, это ПО поддерживает аутентификацию, автррзацию и управление профилями пользователей.
  5. Microsoft выпускает новую версию превью Visual Studio
    Microsoft Corp. выпускает новый релиз среды разработчика Visual Studio 2005 (Community Technology Preview). CTP доступна для скачивания через Microsoft Developer Network. ПО ссылке рассказыватеся как Microsoft усилила безопасность в Visual Studio 2005.

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

Пристальный взгляд на выражения привязки к данным

Пристальный взгляд на выражения привязки к данным
В этой статье обсуждаются некоторые трюки при работе с DataBinder.Eval в приложениях ASP.NET, работающих с данными.

ЯЗЫК:
Автор статьи: Scott Allen

ПЕРЕВОД: Чужа В.Ф. ака hDrummer


Выражения привязки к данным в приложениях ASP.NET – это небольшие участки кода, которые вы видите в aspx-файлах между символами <%# и %>. Обычно мы видим такие выражения при использовании компонентов Repeater (шаблон ItemTemplate) и DataGrid (шаблон TemplateColumn). Также нужно заметить, что выражения привязки к данным часто содержат вызов метода DataBinder.Eval. И хотя это довольно типичный сценарий для привязки в ASP.NET, зная процессы, происходящие за кулисами, можно сделать гораздо больше в этом направлении. В этой статье мы рассмотрим процессы работы привязки к данным, как и когда они работают и продемонстрируем некоторые трюки, которые можно использовать для более тонкой настройки выражений привязки к данным.

Для начала посмотрим на простую вебформу с выражением для привязки к данным:

<form id="Form2" method="post" runat="server">
<table ID="Table3">
<asp:Repeater id="Repeater1" runat="server">
<ItemTemplate>
<tr>
<td><%# DataBinder.Eval(Container.DataItem, "Name") %></td>
<td><%# DataBinder.Eval(Container.DataItem, "HexValue") %></td>
</tr>
</ItemTemplate>
</asp:Repeater>
</table>
</form>


Такая форма выводит на экран пару имя цвета – его шестнадцатиричное значение. Например, AliceBlue #F0F8FF.

В этом примере для отображения данных мы используем компонент Repeater. Мы знаем, что мы можем привязать Repeater к объектам DataTable, DataView, SqlDataReader и т.д. Одна из приятных особенностей привязки к данным – способ, каким ASP.NET абстрагирует источник исходных данных, юлагодаря чему нам не нужно точно знать тип объекта, к которому мы привязываемся.

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

public class Color
{
public Color(string name, byte r, byte g, byte b)
{
this.name = name;
hexValue = String.Format("#{0:X2}{1:X2}{2:X2}",r, g, b);
}

public string Name
{
get { return name; }
}

public string HexValue
{
get { return hexValue; }
}

private string name;
private string hexValue;
}

Конструктор класса Color принимает в качестве параметра имя цвета и значения красной, зелёной и голубой составляющих для его описания. Такой ArrayList, наполненный классами, мы можем построить с помощью такого кода:

public static ArrayList GetColors()
{
   ArrayList list = new ArrayList();
   
   list.Add(new Color(System.Drawing.Color.AliceBlue.Name, 
                      System.Drawing.Color.AliceBlue.R,
                      System.Drawing.Color.AliceBlue.G,
                      System.Drawing.Color.AliceBlue.B)
            );

   list.Add(new Color(System.Drawing.Color.Beige.Name,
                      System.Drawing.Color.Beige.R,
                      System.Drawing.Color.Beige.G,
                      System.Drawing.Color.Beige.B)
            );

   list.Add(new Color(System.Drawing.Color.Chocolate.Name, 
                      System.Drawing.Color.Chocolate.R,
                      System.Drawing.Color.Chocolate.G,
                      System.Drawing.Color.Chocolate.B)
      );

   list.Add(new Color(System.Drawing.Color.DarkMagenta.Name,
                      System.Drawing.Color.DarkMagenta.R,
                      System.Drawing.Color.DarkMagenta.G,
                      System.Drawing.Color.DarkMagenta.B)
      );

   list.Add(new Color(System.Drawing.Color.Fuchsia.Name, 
                      System.Drawing.Color.Fuchsia.R,
                      System.Drawing.Color.Fuchsia.G,
                      System.Drawing.Color.Fuchsia.B)
      );

   list.Add(new Color(System.Drawing.Color.PapayaWhip.Name,
                      System.Drawing.Color.PapayaWhip.R,
                      System.Drawing.Color.PapayaWhip.G,
                      System.Drawing.Color.PapayaWhip.B)
      );

   list.Add(new Color(System.Drawing.Color.Violet.Name, 
                      System.Drawing.Color.Violet.R,
                      System.Drawing.Color.Violet.G,
                      System.Drawing.Color.Violet.B
                     )
      );

   list.Add(new Color(System.Drawing.Color.Black.Name, 
                      System.Drawing.Color.Black.R,
                      System.Drawing.Color.Black.G,
                      System.Drawing.Color.Black.B
                     )
        );
   return list;
}

Отображение значений внутри тэгов <td> не единственное место для использования выражений привязки к данным. Их также можно применить для изменения внешнего вида элемента управления. В следующем примере мы установим фоновый цвет ячейки в цвет выводимого цвета, используя привязку к данным:

<asp:Repeater id="Repeater1" runat="server">
<ItemTemplate>
<tr bgcolor="<%# DataBinder.Eval(Container.DataItem, "HexValue")%>">
<td><%# DataBinder.Eval(Container.DataItem, "Name") %></td>
<td><%# DataBinder.Eval(Container.DataItem, "HexValue") %></td>
</tr>
</ItemTemplate>
</asp:Repeater>

В заключительной части мы глубже рассмотрим процесс привязки к данным в режиме времени выполнения приложения.

За кулисами выражений привязки к данным

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

public void __DataBind__control3(object sender, System.EventArgs e) {
   System.Web.UI.WebControls.RepeaterItem Container;
   System.Web.UI.DataBoundLiteralControl target;
   target = ((System.Web.UI.DataBoundLiteralControl)(sender));
   Container = ((System.Web.UI.WebControls.RepeaterItem)(target.BindingContainer));
       
   #line 17 "E:\dev\xprmnt\aspnet\DataBinding\SimpleData.aspx"
   target.SetDataBoundString(0, 
       System.Convert.ToString(DataBinder.Eval(Container.DataItem, "HexValue")));
            
   #line 18 "E:\dev\xprmnt\aspnet\DataBinding\SimpleData.aspx"
   target.SetDataBoundString(1, 
       System.Convert.ToString(DataBinder.Eval(Container.DataItem, "Name")));
             
   #line 19 "E:\dev\xprmnt\aspnet\DataBinding\SimpleData.aspx"
   target.SetDataBoundString(2, 
       System.Convert.ToString(DataBinder.Eval(Container.DataItem, "HexValue")));
}

Вышеприведенный код взят из временного файла, который сгенерирован из нашей вебформы и размещён ASP.NET во временном каталоге. Здесь мы видим, как переменная Container, которую мы используем для вызова Eval, устанавливается в ссылку на BindingContainer. Этот метод, обработчик событий, будет исполняться всякий раз, когда элемент управления будет вязаться к данным (один раз для каждой строки или один раз для каждого пункта списка, как в этом примере).
Наиболее важно уяснить себе то, что выражение, которое мы использовали для привязки к данным, используется в качестве параметра в методе Convert.ToString. Это значит, что мы можем использовать любое выражение, возвращающее строковый тип. Например, такой вот шаблон ItemTemplate проделает тоже, что и предыдущий код:

<asp:Repeater id="Repeater1" runat="server">
<ItemTemplate>
<tr bgcolor="<%# ((Color)Container.DataItem).HexValue %>">
<td><%# ((Color)Container.DataItem).Name %></td>
<td><%# ((Color)Container.DataItem).HexValue %></td>
</tr>
</ItemTemplate>
</asp:Repeater>

В этом случае мы не обращаемся к методу DataBind.Eval и приводим DataItem к нашему типу Color (заметьте, что в этом случае вам надо импортировать пространство имён, в котором объявлен класс Color, с помощью директивы <@ Import > , например, <%@ Import Namespace="aspnet.DataBinding" %> , если тип Color находится в файле с пространством имён aspnet.DataBinding.
Использование DataBinder.Eval позволяет избежать беспорядочных приведений типов в файле ASPX. Вместо этих приведений, Eval использует технику отражений (reflection) для динамического обнаружения свойства по имени в режиме времени выполнения. Ну а поскольку отражение относительно медленно работает, то и использование Eval относительно медленнее, чем использование приведений. С другой стороны, сильным местом DataBinder.Eval является то, что он работает как с файлом ASPX на C#, так и на VB.NET. В приведенном же выше виде, такой код ASPX будет компилироваться только на C#.
В то время, как вышеприведенный пример демонстрирует каким образом можно избежать использования DataBinder.Eval в наших выражениях привязки к данным, давайте сделаем ещё один концептуальный шаг вперёд и вызовем метод из выражения привязки к данным:

<asp:Repeater id="Repeater1" runat="server">
<ItemTemplate>
<tr bgcolor="<%# ((Color)Container.DataItem).HexValue %>">
<td><%# GetColorName(Container.DataItem) %></td>
<td><%# ((Color)Container.DataItem).HexValue %></td>
</tr>
</ItemTemplate>
</asp:Repeater>

Здесь мы вызываем метод GetColorName и передаём в него DataItem как параметр. Вызов метода из такого выражения предоставляет нам возможность использования дополнительной логики. Этот метод должен быть объявлен как защищённый (protected) в классе code-behind кода, поскольку динамически генерируемый класс из ASPX наследуется именно из него. Этот метод показан ниже.

protected string GetColorName(object o)
{
   string name = string.Empty;

   Color color = o as Color;
   if(color != null)
   {
      name = color.Name;
      int i = 1;
      do
      {
         if(char.IsUpper(name, i))
         {
            name = name.Insert(i, " ");
            i = i +2;
         }
         else
         {
            i = i + 1;
         }

      } while(i < name.Length);
   }

   return name;
}

Этот метод принимает имя цвета как параметр, например “PapayaWhip”, и вставляет пробелы перед каждой большой буквой такого цвета, выдавая, например, “Papaya Whip”.
Надеюсь, в этой статье продемонстрированы некоторые полезные трюки, которые вы сможете использовать в своих собственных сценариях привязки к данным.

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

Время кода

Поговорим о политике

ЯЗЫК: C#
АВТОР:Чужа В.Ф ака hDrummer,
Информация об авторе

Код к статье: -

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

Основная информация доступна в комментариях к коду, я лишь обрисую ход мысли. Итак, у нас есть некий абстрактный человек (абстрактный класс Man), который имеет Ф.И.О. и номер паспорта. Для того, чтобы можно было создать реальный объект такого типа, мы создаём класс RealMan, наследующий классу Man. В нём реализуем конструктор, заполняющий поля реальными данными. Также создаём в нём виртуальный метод ExitPool, выдающий сообщение работнику аналитической компании на выходе из участка для голосования. Далее определяем интерфейс IVote, в котором объявляем заголовок единственного метода IDoVoteFor. Теперь займёмся созданием представителей трёх конкретных «партий» голосующих – того, кто будет голосовать за Ющенко (класс VoterForU), того кто будет голосовать за Януковича (класс VoterForYa) и того, кто будет голосовать против всех (класс VoterAgainstAll). Эти классы унаследуем как от базового для них класса RealMan, так и от интерфейса IVote, а также перегрузим в них метод ExitPool. Затем создадим массив объектов этих классов и, пробежавшись по нему с помощью конструкции foreach, получим результат, увидев полиморфизм в действии.

using System;

namespace Voter
{
class TestVoter
{
[STAThread]
static void Main(string[] args)
{
// Можно сделать так, привычным путём
// VoterForU vfu = new VoterForU();
// vfu.ExitPool();
// vfu.IDoVoteFor();
// VoterForYa vfy = new VoterForYa();
// vfy.ExitPool();
// vfy.IDoVoteFor();
// VoterAgainstAll vaa = new VoterAgainstAll();
// vaa.ExitPool();
// vaa.IDoVoteFor();
// А можно чуть-чуть извратиться

RealMan[] rm = {new VoterForU(), new VoterForYa(), new VoterAgainstAll()};
foreach (RealMan r in rm)
{
// полиморфизм в действии
r.ExitPool();
// поскольку все классы реализуют интерфейс IVote, то будет вызвана собственная реализация для каждого из классов
((IVote)r).IDoVoteFor();
}

}
}
// Вывод на экране
// Чебурашка: Отдам свой голос за Януковича (просто не хочу говорить правду).
// Чебурашка голосует за Ющенко, № паспорта 3222223
// Крокодил Гена: Отдам свой голос за Януковича.
// Крокодил Гена голосует за Януковича, № паспорта 2333332
// Шапокляк: Да пошли б они оба! Лариска! За мной!
// Шапокляк голосует против всех, № паспорта 01010101

// абстрактный класс - какой-то человек с каким-то набором данных

abstract class Man
{
protected string fio;
protected string passportNumber;
}

// реальный человек, с помощью конструктора заполняем поля реальными данными
// обратите внимание на то, что поля используются те, которые объявлены в абстрактном классе

class RealMan : Man
{
public RealMan(string fio, string passportNumber)
{
this.fio = fio;
this.passportNumber = passportNumber;
}

// виртуальный метод, отображающий ответ на выходе
public virtual void ExitPool()
{
Console.WriteLine("Не скажу, кому отдам свой голос.");
}
}

// класс наследуется от другого класса и интерфейса
class VoterForU : RealMan, IVote
{
// конструктор обращается к конструктору базового класса
public VoterForU():base("Чебурашка", "3222223"){}
// реализация метода интерфейса
public void IDoVoteFor()
{
Console.WriteLine(base.fio+" голосует за Ющенко, № паспорта "+base.passportNumber);
}
// перегруженный метод базового класса RealMan
public override void ExitPool()
{
Console.WriteLine(base.fio+": Отдам свой голос за Януковича (просто не хочу говорить правду).");
}
}

class VoterForYa : RealMan, IVote
{
public VoterForYa():base("Крокодил Гена", "2333332"){}
public void IDoVoteFor()
{
Console.WriteLine(base.fio+" голосует за Януковича, № паспорта "+base.passportNumber);
}
public override void ExitPool()
{
Console.WriteLine(base.fio+": Отдам свой голос за Януковича.");
}
}
class VoterAgainstAll : RealMan, IVote
{
public VoterAgainstAll():base("Шапокляк","01010101"){}
public void IDoVoteFor()
{
Console.WriteLine(base.fio+" голосует против всех, № паспорта "+base.passportNumber);
}
public override void ExitPool()
{
Console.WriteLine(base.fio+": Да пошли б они оба! Лариска! За мной!");
}
}

interface IVote
{
void IDoVoteFor();
}
}

На этом всё.


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

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

Не сразу обновляется поле в таблице Access
OleDBConnection & ASP.NET
Склейка нескольких таблиц
INSERT INTO: как указать, что значение в VALUES это число со зн. после запятой?
Custom WebControl
SmartNavigation = "true" А при постбэке бросает наверх :-(
Textbox в гриде
Get на сервер
файл ошибок для ASP.NET


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



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


Рассылки Subscribe.Ru
.Net Собеседник - Новости мира Net, C#, ASP.Net

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

В избранное