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

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


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

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

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

От автора

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

В последнее время часто сталкиваюсь с вопросами на форумах о создании отчётов в Crystal Reports, а точнее с проблемами, связанными с такими видами отчётов. В тоже время многие забывают (а может быть просто игнорируют) возможность создания отчётов для веб-приложений прямо в окне IE. Такие отчёты можно строить как с помощью DataGrid, DataList или Repeater'a, так и с помощью таблицы, созданной вручную с использованием с помощью HTML-тэгов.
Вот пример отчёта, созданного с помощью компонента Repeater, и являющийся быстрым способом создания простого отчёта с помощью IE.

private void Page_Load(object sender, System.EventArgs e)
{
// создаём таблицу - источник данных
DataTable dt = new DataTable("RepeaterReport");
DataColumn dc = new DataColumn("id", typeof(int));
dc.AutoIncrement = true;
dc.Unique = true;
dt.Columns.Add(dc);
dc = new DataColumn("URL", typeof(string));
dt.Columns.Add(dc);
dc = new DataColumn("IP", typeof(string));
dt.Columns.Add(dc);
// добавляем данные
DataRow dr;
dr = dt.NewRow();
dr["URL"] = "http://dotnetgrains.sql.ru/";
dr["IP"] = "10.10.0.1";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["URL"] = "http://www.sql.ru/";
dr["IP"] = "10.10.0.2";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["URL"] = "http://msdn.microsoft.com/";
dr["IP"] = "10.10.0.3";
dt.Rows.Add(dr);
// привязываемся к Repeater'у
Repeater1.DataSource = dt;
Repeater1.DataBind();
}

Это код формы в aspx-файле -

<form id="Form2" method="post" runat="server">
<asp:Repeater id="Repeater1" runat="server">
<HeaderTemplate>
<table width="100%" border="1" cellspacing="0" ID="Table14">
<thead>
<tr>
<td>№ п/п</td>
<td>URL</td>
<td>IP-адрес</td>
</tr>
</thead>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><%#DataBinder.Eval(Container.DataItem, "id")%> </td>
<td><%#DataBinder.Eval(Container.DataItem, "url")%> </td>
<td><%#DataBinder.Eval(Container.DataItem, "ip")%> </td>
</tr>
</ItemTemplate>
<FooterTemplate>
<tr>
<td colspan="3" align="right">Отчёт создан
<%# DateTime.Now%>
</td>
</tr>
</table>
</FooterTemplate>
</asp:Repeater>
</form>

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

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

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

  1. TechTalk объявила о выходе Genome 2.0
    TechTalk объявила о выходе нового релиза Genome, object-relational-mapping инструмента для платформы Microsoft .NET. Использование таких инструментов существенно снижает стоимость привязки ОО модели к БД.
  2. Вышел dtSearch Publish V6.33
    dtSearch Publish запишет коллекцию ваших документов на CD/DVD с возможностью поиска по этой коллекции. Содержит более дюжины настроек для поиска. dtSearch - "мощное средство для поиска по тексту ... эффективное благодаря уровню своего интеллекта".
  3. ComponentOneВ® выпускает ComponentOne DevKits для Visual Studio .NET и Borland® Delphi 8
    ComponentOne выпустил ComponentOne DevKit для Visual Studio .NET и ComponentOne DevKit для Borland® Delphi 8. Эти наборы включают не только поддержку сред разработок .NET и Delphi 8, они также включают целый спектр наборов компонент для платформ .NET, ASP.NET, Mobile Devices и даже COM, которые включены в набор ComponentOne Studio Enterprise.
  4. Вышел DotNetBar 4.0 с элементами управления OneNote Tab Control и Diamond Docking
    DotNetBar 4.0 теперь содержит Tab Control в стиле OneNote, а также руководство Diamond Docking Guides по плавающим окнам. DotNetBar – коллекция из 10 компонент для создания оригинальных пользовательских интерфейсов.
  5. Вышел ASPXpand 1.1
    ASPXpand 1.1 предлагает более 60 различных функций, позволяющих разработчику строить более оригинальные и функциональные веб-приложения. ASPXpand – это библиотека с такими функциями как Mask Edit, MsgBox, Confirmation Button, "Click Once" Button, Several Different Tool-Tips, Set Focus, Easy Validation и Client-Server Timer и т.п.
  6. Kentico объявила о выходе Kentico CMS для ASP.NET
    Kentico объявила о выходе новой системы управления контентом Kentico CMS для ASP.NET. Kentico CMS – хорошее решение для веб-сайтов с высокоструктурированными данными, таких как сайты электронной коммерции, каталоги продуктов или базы знаний.
  7. AGD Studio выпустила Email Verifier CustomValidator
    Онлайновый бизнес тратит тонны денег на очистку своих БД от фальшивых е-мэйл адресов. Использование компонента Email Verifier CustomValidator поможет вам в борьбе с этой проблемой.
  8. DBI выпустила NavTools 3.0
    DBI Technologies Inc выпустила NavTools 3.0, набор навигационных элементов управления для разработки Windows-презентаций, включающий 7 .NET и 7 ActiveX компонент.
  9. DBI Technologies улучшает Studio Controls
    DBI's Studio Controls теперь содержит 81 элемент управления COM (ActiveX) и .NET в одном наборе. DBI включает такие элементы управления, как планировщик встреч, редактирование данных/ввода, диалоги, календарь, навигационные элементы, анимацию, презентации, линейки и т.д.
  10. dbiCalendar Tools для .NET от DBI Technologies
    dbiCalendar Tools (для .NET) от DBI Technologies Inc – функциональное решение, которое удовлетворит любые ваши дизайнерские прихоти на платформе .NET. dbiCalendar, dbiDate, dbiDropDate и dbiMonth имеют много общих свойств и методов, что позволяет им легко обмениваться данными друг с другом.
  11. Axosoft выпустила OnTime 2004, бесплатный детектор дефектов для Web и Windows
    Axosoft выпустила четвёртую версию популярного .NET и SQL инструмента для идентификации ошибок. Однопользовательская версия OnTime 2004 бесплатна – смотрите на http://www.axosoft.com/.
BUGs, FIXes and HOW TO's -
  1. BUG: The Visual Studio .NET smart device emulator does not load an operating system image or an operating system skin in Visual Studio .NET 2003
  2. FIX: The compiler does not call an overridden copy constructor in Visual C++ .NET 2003
  3. "Unable to open Web project" error message or "Web server conflict" error message when you try to open a Web project
  4. BUG: Visual Studio .NET may stop responding if a project contains lots of .aspx, .asmx, and .xsd files
  5. How to validate Windows user rights in a Visual Basic .NET application
  6. BUG: User controls on a Windows form reposition to the top of the screen in the Visual C# Form Designer
  7. An application that ran correctly before a restart now does not run because the Active Directory schema is not correctly cached by ADSI
  8. FIX: Client-side caching does not occur when you use the OutputCache directive with the VaryByParam attribute
  9. The Properties window display and the Class View selection do not change when you select an item in the Properties window drop-down list box in Visual Studio .NET

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

Статья выпуска

Компоненты контроля ввода ASP .Net (окончание) 

ЯЗЫК: ASP.Net
Автор статьи: Чужа В.Ф. ака hDrummer http://dotnetgrains.sql.ru/

Omnia vita in aperta leviora sunt.
Обнаруживший себя изъян наименее опасен.
Доверяй, но проверяй.
Народная поговорка

Если мы хотим позволить пользователю вводить год рождения как в виде четырёх, та и в виде двух цифр, то можно изменить шаблон на “\d{2,4}”, хотя необходимо помнить, что в этом случае возникает возможность ввода значения, содержащего 3 цифры. Дополнительную информацию по шаблонам можно получить на сайте http://msdn.microsoft.com.

Компонент CompareValidator

Данный ККВ обычно используется для сравнения введенного значения с указанным, со значением в другом элементе ввода, с некоторой постоянной, а также для проверки типа введенного значения. Допустим, что нам необходимо узнать рост человека, заполняющего нашу анкету. Как известно, рост в большинстве случаев измеряется в метрах и не является целым числом. Поэтому, добавим поле для ввода tbH и ККВ cvH с проверкой введенного значения на тип «double» к нашему примеру (рис.3(файл valid3.jpg)):

<!—CompareValidator-->
<html>
<head></head>
<title>Пример использования ККВ CompareValidator</title>
<body>
<form id="v1" runat="server"><br>
<h3>Введите Ваше Ф.И.О.:</h3><br>
<asp:TextBox id="tbFIO" rows="1" width="75" runat="server"/>
<asp:RequiredFieldValidator id="rfvFIO" ControlToValidate="tbFIO"
ErrorMessage="Необходимо ввести Ваши фамилию, имя и отчество"
display="static" runat="server"/><br>
<h3>Год Вашего рождения:</h3><br>
<asp:TextBox id="tbYear" rows="1" width="75" runat="server"/><br>
<asp:RequiredFieldValidator id="rfvYear" ControlToValidate="tbYear"
ErrorMessage="Необходимо ввести год Вашего рождения"
display="static" runat="server"/><br>
<asp:RegularExpressionValidator id="revYear" ControlToValidate="tbYear"
ErrorMessage="Необходимо ввести 4 цифры года, например 1972"
validationExpression="\d{4,4}"
display="static" runat="server"/><br>
<h3>Ваш рост (м)</h3><br>
<asp:TextBox id="tbH" rows="1" width="75" runat="server"/>
<asp:CompareValidator id="cvH" type="double" operator="DataTypeCheck"
ErrorMessage="Необходимо ввести рост в виде 1,75" ControlToValidate="tbH"
display="static" runat="server"/><br>
<asp:Button id="btnOk" text="Подтвердить" runat="server"/>
</form>
</body>
</html>

Пример 3. Использование ККВ CompareValidator

Однако необходимо учесть тот факт, что любое значение, способное конвертироваться в тип double, будет принято. Т.е., например, при вводе роста 2000 м никакого сообщения об ошибке не будет. Впрочем, комбинируя различные значения свойств ККВ CompareValidator можно добиться более чёткого контроля над вводом пользователя. Эти свойства могут принимать следующие значения (см. таблицу 1):

Таблица 1. Значения свойств ККВ CompareValidator

Свойство Перечень значений
type String, Integer, Double, DateTime, Currency
operator Equal, NotEqual, GreaterThan, LessThan, GreaterThanEqual, LessThanEqual, DataTypeCheck

Замечу, что для того, чтобы сверять введенное значение со значением в другом поле ввода, необходимо присвоить имя этого поля ввода свойству ControlToCompare. А для того, чтобы сравнить введенное значение с некоторой постоянной, необходимо указать эту постоянную в свойстве ValueToCompare. Одновременно пользоваться этими двумя условиями проверки не рекомендуется.

Компонент RangeValidator

Этот компонент поможет нам убедиться в том, что введенное значение находится в определённом диапазоне. Типы данных, которые могут использоваться в сравнении: String, Integer, Double, Date, Currency. Воспользовавшись вышеуказанной возможностью использования нескольких ККВ для одного и того же поля ввода, добавим код для контроля введенного роста от 0 до 2,5 метров (рис.4(файл valid4.jpg)):

<!—RangeValidator-->
<html>
<head></head>
<title>Пример использования ККВ RangeValidator</title>
<body>
<…>
<Часть кода опущена. Смотрите в предыдущих примерах.>
<…>
<h3>Ваш рост (м)</h3><br>
<asp:TextBox id="tbH" rows="1" width="75" runat="server"/>
<asp:CompareValidator id="cvH" type="double" operator="DataTypeCheck"
ErrorMessage="Необходимо ввести рост в виде 1,75" ControlToValidate="tbH"
display="static" runat="server"/><br>
<asp:RangeValidator id="rvH"
ErrorMessage="Рост должен быть в диапазоне от 0 до 2,5 м" ControlToValidate="tbH"
type="double" minimumValue="0" maximumValue="2,5"
display="static" runat="server"/><br>
<asp:Button id="btnOk" text="Подтвердить" runat="server"/>

Пример 4. Использование ККВ RangeValidator

Компонент CustomValidator

Случается, что функциональности существующих ККВ не достаточно для того, чтобы проверить значение на соответствие некоему сложному условию. Именно тогда нам на помощь придёт компонент CustomValidator, с помощью которого можно использовать собственные функции проверки соответствия значения заданному условию, вернув в качестве результата true или false. В качестве примера разработаем компоненту, проверяющую значение в поле ввода tbEducation на «высшее» или «среднее» (рис.5 (файл valid5.jpg))

<!—CustomValidator-->
<html>
<head></head>
<title>Пример использования ККВ CustomValidator</title>
<body>
<…>
<Часть кода опущена. Смотрите в предыдущих примерах.>
<…>
<asp:RangeValidator id="rvH"
ErrorMessage="Рост должен быть в диапазоне от 0 до 2,5 м" ControlToValidate="tbH"
type="double" minimumValue="0" maximumValue="2,5"
display="static" runat="server"/><br>
<h3>Образование :</h3>
<asp:TextBox id="tbEducation" rows="1" width="125" runat="server"/>
<asp:CustomValidator id="cvEducation" ControlToValidate="tbEducation"
ErrorMessage="Образование должно быть среднее или высшее" onServerValidate="subValidEduc"
display="static" runat="server"/><br>
<asp:Button id="btnOk" text="Подтвердить" runat="server"/>
</form>
</body>
</html>

<script language="VB" runat="server">
sub subValidEduc(s as object, e as ServerValidateEventArgs)
if (e.value="высшее") or (e.value="среднее") then
e.IsValid = true
else
e.IsValid = false
end if

end sub
</script>

Пример 5. Использование ККВ CustomValidator

Не смотря на то, что в данном примере демонстрируется контроль ввода на стороне сервера (что видно по тэгу <script language="VB" runat="server">, а также из onServerValidate="subValidEduc"), ASP.Net автоматически формирует и клиентский скрипт проверки ввода на языке Javascript для всех ККВ. Скрипт этот можно увидеть, просмотрев исходный код одной из полученных в результате наших экспериментов html-страничек. Автоматической генерации скрипта можно избежать путем изменения различных настроек, однако по умолчанию эта опция включена. Отсюда следует, что до тех пор, пока на клиенте не будут внесены все значения правильно, форма отослана на сервер не будет. Можно пойти и другим путём, явно указав в свойстве ClientValidationFunction имя функции-валидатора на стороне клиента, однако в этом случае её придётся написать самому на языке Javascript.

Компонент ValidatonSummary

Этот компонент позволяет нам отображать все ошибки в отведённом для этого конкретном месте. Если быть точным, то отображаются значения свойства ErrorMessage указанных ККВ в общем отчёте об ошибках ввода. Для того чтобы сообщения об ошибках не дублировались самими ККВ, нужно поставить звёздочку (*) или какое-нибудь короткое сообщение сразу после начального тэга ККВ (см. пример 6 и рис.6 (файл valid6.jpg)).
Основные свойства компонента ValidationSummary:

  1. HeaderText – заголовок области отображения ошибок
  2. DisplayMode – настойка отображения ошибок:
    1. BulletList (по умолчанию) – список с маркерами
    2. List – немаркированый список
    3. SingleParagraph – в строчку
  3. ShowSummary – Это свойство используется для программного контроля над отображением или скрытием отчёта об ошибках. Может принимать значения true или false.
  4. ShowMessageBox – позволяет отобразить отчёт об ошибках в окне сообщений. Для того чтобы воспользоваться этой возможностью, данное свойство нужно установить в «true», а свойство ShowSummary – в «false».

<!--ValidationSummary-->
<html>
<head></head>
<title>Пример использования ValidationSummary</title>
<body>
<form id="v1" runat="server"><br>
<h3>Введите Ваше Ф.И.О.:</h3>
<asp:TextBox id="tbFIO" rows="1" width="75" runat="server"/>
<asp:RequiredFieldValidator id="rfvFIO" ControlToValidate="tbFIO"
ErrorMessage="Необходимо ввести Ваши фамилию, имя и отчество"
display="static" runat="server">*</asp:RequiredFieldValidator>
<br>
<h3>Год Вашего рождения:</h3>
<asp:TextBox id="tbYear" rows="1" width="75" runat="server"/><br>
<asp:RequiredFieldValidator id="rfvYear" ControlToValidate="tbYear"
ErrorMessage="Необходимо ввести год Вашего рождения"
display="static" runat="server">Будьте внимательны при вводе</asp:RequiredFieldValidator>

<asp:RegularExpressionValidator id="revYear" ControlToValidate="tbYear"
ErrorMessage="Необходимо ввести 4 цифры года, например 1972"
validationExpression="\d{4,4}"
display="static" runat="server">*</asp:RegularExpressionValidator>
<br>
<asp:Button id="btnOk" text="Подтвердить" runat="server"/>
<br><br>
<asp:ValidationSummary id="valSummary"
headerText="Обратите внимание на ошибки ввода и исправьте их:"
showSummary="true"
display="static" runat="server"/>
</form>
</body>
</html>

Пример 6. Использование компонента Validation Summary

Заключение

В данной статье были описаны шесть компонент, относящиеся к ASP.Net Web Controls и позволяющие программисту держать под контролем ввод пользователя, заблаговременно предупреждая его об ошибках. Заметим ещё раз, что ККВ по умолчанию генерируют код, как на стороне сервера, так и на стороне клиента. Также необходимо отметить как положительный факт то, что, не смотря на разнообразие функциональности готовых компонент, разработчиками была предусмотрена возможность написания пользовательских ККВ. В целом же можно сказать, что набор компонент с именно такой функциональностью далеко не случаен и, безусловно, послужит написанию безопасных приложений, отсекающих массу ошибок ещё на стадии ввода.

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

Время кода

Создание классов коллекций в C#

ЯЗЫК: C#
АВТОР: Bipin Joshi,
http://www.dotnetbips.com/
ПЕРЕВОД: Чужа В.Ф ака hDrummer

Вступление

Классы коллекций часто используются в .NET. Это такие классы, как ArrayList, NamevalueCollection и HashTable. Характерной чертой таких классов является их использование в циклах foreach(...) в C#. В VB.NET есть похожая конструкция For...Each. Ваши классы также могут перебираться таким способом, если включить реализацию нескольких интерфейсов. В этой статье мы увидим как закодировать классы коллекций с помощью C#.

Класс-пример

Для нашего примера предположим, что нам нужна некая структура, в которой мы можем хранить список литературы. Мы должны иметь возможность добавлять, удалять и перебирать экземпляры этого списка. Мы создадим класс Books для хранения этого списка. Перед тем как углубляться в подробности создания класса с поддержкой коллекций, взглянем на скелет класса Books.

namespace CollectionClass
{
class Books
{
private ArrayList m_booktitles;
public Books()
{
m_booktitles=new ArrayList();
}

public void Add(string booktitle)
{
m_booktitles.Add(booktitle);
}

public void Remove(string booktitle)
{
m_booktitles.Remove(booktitle);
}
}
}

Вы конечно заметили, что мы пошли по лёгкому пути реализации добавления и удаления элементов этого списка – с помощью ArrayList. Однако, мы не можем перебирать объекты этого класса с помощью конструкции foreach. Для этого нам надо выполнить следующие условия:

  1. Реализовать интерфейс System.Collections.IEnumerable в классе Books
  2. Создать класс, реализующий интерфейс System.Collections.IEnumerator

Интерфейс IEnumerable

Интерфейс IEnumerable имеет только один метод GetEnumerator(), который возвращает класс, реализующий интерфейс IEnumerator. Следующий код показывает класс Books после реализации интерфейса IEnumerable.

class Books:IEnumerable
{
public ArrayList m_booktitles;

public Books()
{
m_booktitles=new ArrayList();
}

public void Add(string booktitle)
{
m_booktitles.Add(booktitle);
}

public void Remove(string booktitle)
{
m_booktitles.Remove(booktitle);
}

public IEnumerator GetEnumerator()
{
return new BooksEnumerator(this);
}
}

Метод GetEnumerator() возвращает объект класса BooksEnumerator, который мы обсудим далее.

Интерфейс IEnumerator

Интерфейс IEnumerator объявлен в пространстве имён System.Collection. Этот интерфейс содержит такие свойства и методы, которые нам надо реализовать:

public bool MoveNext()
{
}
public void Reset()
{
}
public object Current
{
}

Метод MoveNext говорит нам о том, что делать, если пользователь хочет переместиться вперёд по коллекции. Метод Reset устанавливает начальное положение в коллекции, т.е. -1. Метод Current возвращает текущий элемент коллекции.

Класс BooksEnumerator

Вот весь код класса, реализующего интерфейс IEnumerator.

class BooksEnumerator : IEnumerator
{
private int position = -1;
private Books books;

public BooksEnumerator(Books books)
{
this.books = books;
}

public bool MoveNext()
{
if (position < books.m_booktitles.Count - 1)
{
position++;
return true;
}
else
{
return false;
}
}

public void Reset()
{
position = -1;
}

public object Current
{
get
{
return books.m_booktitles[position];
}
}
}

Мы передали наш класс Books в конструктор этого класса. Этот класс затем содержит указатель на текущую позицию в коллекции.

Использование нашего класса

Теперь можно таким образом использовать наш класс Books в коде:

class Class1
{
static void Main(string[] args)
{
Books b=new Books();

b.Add("vb.net");
b.Add("c#");
b.Add("asp.net");

foreach(string s in b)
{
Console.WriteLine(s);
}
} }

Удачного кодинга!


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

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

Генерация Exel с помощью ASP
ObjectSpaces
XML + ASP
Печать.....
Помогите с отчетом
Коллекция реализующая IBindingList не отображает в DataGrid колонки полей
Microsoft Speech SDK...
Crystal Reports и формат отображения
аля плагин...
Ошибка myReader.GetBytes



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



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


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


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу


В избранное