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

В этом номере вы сможете прочитать продолжение сравнительного обзора языка C#, новости из мира .Net и очередную подсказку – о том, как можно сэкономить экранное место.


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


.Net Собеседник 3

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

От автора

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

Вот и закончилась трёхнедельная вереница праздников, теперь можно перестроиться на рабочий лад. По крайней мере попробовать :)
В этом номере вы сможете прочитать продолжение сравнительного обзора языка C#, новости из мира .Net и очередную подсказку – о том, как можно сэкономить экранное место.
А сейчас мне ещё раз хотелось бы вернуться к вопросу об индексаторах. В одной из статей (книг?) я прочёл, что одним из плюсов применения индексаторов есть отсутствие необходимости выделять в цикле память под объекты класса, как это необходимо делать в случае создания массива объектов некоего класса. Источник, к сожалению, сейчас привести не могу, но если ещё раз наткнусь на него, то ссылку дам обязательно. Ну да дело не в этом. Ещё тогда меня эта фраза удивила, но проверить это сомнительное утверждение времени не было. И вот теперь я решил вернуться к этому вопросу.
Посмотрим следующий код:

using System;
namespace Indexers{
class TestIndexers
{
 class Kassa
 {
 // Воспользуемся инициализацией при объявлении
 //хотя можно было это сделать в конструкторе
 decimal[] cash = new decimal[10];
 public decimal this[int index]
{
 //Установка значения
get
{
 if (index>=0 && index<10)
{
  return cash[index];
} else return -1;
}
//Чтение значения
set
{
 if (index >=0 && index<10)
 { cash[index] = value; }
}
}
}
[STAThread]
static void Main(string[] args)
{
// Создаём объект Kassa k1 = new Kassa();
// Инициализируем элементы массива с помощью индексатора
k1[0] = 100.00M;
k1[1] = 5.44M;
k1[2] = 3.99M;
//Выводим их на экран
Console.WriteLine("Ячейка 1 = {0}", k1[0].ToString("c"));
//вывод на экран : Ячейка 1 = 100.00р.
Console.WriteLine("Ячейка 2 = {0}", k1[1].ToString("c"));
//вывод на экран : Ячейка 2 = 5.44р.
Console.WriteLine("Ячейка 3 = {0}", k1[2].ToString("c"));
//вывод на экран : Ячейка 3 = 3.99р. }}}

В этом коде приведен пример создания индексатора для отображения количества наличности ячеек в кассе, тут всё ясно и прозрачно и вопросов быть не должно, если же мы попытаемся добавить класс, который будет представлять собой кассовый зал, то, естественно, нам придётся каким-то образом выделять память для объекта класса Kassa.

class KassaHalle
{
Kassa[] kassa;
// Перекроем конструктор по умолчанию
public KassaHalle() {
kassa = new Kassa[5];
//выполняем инициализацию
for (int i=0;i<5;i++) {
kassa[i] = new Kassa();
}
}
// Теперь индексатор
public Kassa this[int i] {
// Проверки опустим для экономии места
 get {return kassa[i];}
 set {kassa[i] = value;}
}
}

Класс KassaHalle представляет собой абстракцию кассового зала, в котором находятся несколько касс, в каждой ячейке которых присутствует (или отсутствует) некая сумма наличности. Так вот, если мы опустим инициализацию внутри конструктора и попытаемся использовать несозданный объект, то, конечно же, получим исключение Object reference not set to an instance of object. Далее показан участок кода для работы с классом KassaHalle.

KassaHalle kh = new KassaHalle();
kh[0][0] = 55.00M;
kh[0][1] = 11.1M;
kh[1][3] = 33.55M;
//Выводим их на экран
Console.WriteLine("Касса 1 Ячейка 1 = {0}", kh[0][0].ToString("c"));
//вывод на экран : Касса 1 Ячейка 1 = 100.00р.
Console.WriteLine("Касса 1 Ячейка 2 = {0}", kh[0][1].ToString("c"));
//вывод на экран : Касса 1 Ячейка 2= 5.44р.
Console.WriteLine("Касса 2 Ячейка 4 = {0}", kh[1][3].ToString("c"));
//вывод на экран : Касса 2 Ячейка 4 = 3.99р.

И ещё пара моментов.

Во-первых, инициализацию массива можно было бы провести в цикле, находящемся вне класса, не в конструкторе. Но это уже будет отходом от принципов ООП.

Во-вторых, в реально работающем классе необходимо предусмотреть динамически изменяемое количество касс и ячеек в них.

А на третье, пожалуй, самое интересное. Одной из сильных сторон индексаторов можно назвать то, что в его методах get и set мы, конечно же, можем производить какие-то действия с элементами массива, перед тем как их вернуть. Например, возвращать значение типа string, уже отформатированное в виде какой-то валюты. Или, изменив класс следующим образом, действительно отказаться от инициализации объектов массива в цикле конструктора класса:

class KassaHalle
{
Kassa[] kassa;
// Перекроем конструктор по умолчанию
public KassaHalle() {
kassa = new Kassa[5];
//Теперь уже не выполняем инициализацию
// for (int i=0;i<5;i++)
// {
// kassa[i] = new Kassa();
// }
}
// Теперь индексатор
public Kassa this[int i] {
get
{
// Проверим, проинициализирован ли объект массива
if (kassa[i]!=null)
{ return kassa[i]; }
// если нет - инициализируем его прямо на месте, по требованию
else {return kassa[i] = new Kassa();} }

set {
if (kassa[i]!=null)
{ kassa[i] = value;
}
// также и для модификатора установки значения массива
else {
kassa[i] = new Kassa(); kassa[i] = value;
}
}
}}}

Таким образом, автор той публикации был прав. По ходу этого небольшого исследования выяснилась ещё одна интересная вещь. Казалось бы, в модификаторе get индексатора Kassa класса KassaHalle не стоит создавать проверку объекта массива на существование, поскольку перед тем как получить какое-то значение, мы должны его задать в методе set. Может быть это было бы верно (хоть и с натяжкой) в случае класса с индексатором, но в данном случае мы имеем вложенный индексатор и в присваивании вида k1[0][0] = 100.00M сначала происходит обращение именно методу get индексатора внешнего класса, в котором такая проверка необходима.
На этом всё, желаю интересного чтения. Надеюсь, что вам понравился поворот событий в конце статьи :)

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

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

  1. CenterSpace Software выпустила статистическую библиотеку для .NET
    15 декабря 2003 г. CenterSpace Software, ведущий поставщик библиотек математических компонент для платформы .NET, объявила о выпуске библиотеки NMath Stats. Библиотека NMath Stats является частью набора CenterSpace Software's NMath, которая реализует объектно-ориентированные компоненты для математических, инженерных, научных и финансовых приложений для платформы .NET. "NMath Stats предлагает функции статистических вычислений, включая описательную статистику, вероятностное распределение, функции комбинаторики, многоступенчатой линейной регрессии (multiple linear regression), проверку и гипотез и анализа вариантов", - утверждает Trevor Misfeldt, CEO. Созданные согласно спецификации Microsoft Common Language Specification, все процедуры библиотеки NMath Stats могут использоваться любым языком .NET, включая C#, Visual Basic.NET и управляемый C++. 14-дневная бесплатная версия доступна для загрузки с веб-сайта CenterSpace по адресу http://www.centerspace.net , вместе с документацией, показателями эффективности работы, примерами кода.

  2. Выпущена ORM.NET v1.6 - создайте свой слой доступа к данным за считанные секунды
    Olero Software выпустила версию 1.6 своего популярного инструмента для отображения объектов и их отношений, а также генерации кода - ORM.NET. ORM.NET теперь полностью поддерживает генерацию кода на VB.NET и возможность редактирования пространств имён. ORM.NET сэкономит .NET разработчикам немало времени и усилий путём создания слоя доступа к данным (Data Access Layer) ADO.NET, основанного на схеме вашей базы данных SQL. Сгененрированный компонент времени выполнения покажет все таблицы как классы, а поля(в смысле колонки) как свойства. Используя встроенный объект DataManager, пользователи смогут легко получить данные из нескольких таблиц с помощью сложного запроса, без создания хранимых процедур или встроенного SQL-кода. В добавок, обновление данных, вставка и удаление могут быть выполнены с помощью вызова единственного метода. Больше информации вы можете получить на сайте www.olero.com, а также скачать бесплатную пробную версию.
    Дата выхода – 28.12.2003.

  3. Red Earth Technologies объявила о выходе Superior SQL Builder v1.3
    Red Earth Technologies выпустила версию 1.3 Superior SQL Builder’a, SQL-инструмента, позволяющего пользователю визуально строить полноценные SQL-скрипты без набора кода в ручную. Superior SQL Builder представляет новую технологию написания SQL-скриптов, предоставляя возможность пользователям легко и быстро изменять данные в БД. В версии 1.3 технология создания скриптов была расширена и улучшена, так что создание сложных SQL-скриптов может быть выполнена за меньшее время и с большей простотой.
    Дата выхода: 08.01.2004.

  4. EzGrid
    Полнофункциональная таблица данных для платформы .NET (бесплатная)

    Что случилось с принципами "plug and play", "Нет необходимости кодировать" и "RAD - Rapid Application Development (быстрая разработка приложений)" для компонент таблиц данных? Они как будто выпали из общего ряда со времени представления платформы .NET. Мы (имеется ввиду компания-разработчик ;) хотели бы представить полнофункциональный компонент, которым будет легко пользоваться, такой же, как те старые, добрые компоненты ActiveX, которыми мы пользовались годами.

    Почему мы выпустили этот продукт? Рынок переполнен супердорогими компонентами таблиц данных, которые делают всё, что возможно сделать в подлунном мире и так сложны, что проще построить корабль для полётов на ту же Луну. Мы хотели бы что-то сделать для сообщества программистов и это наш способ сказать «спасибо» тем, кто поддерживал компанию Component Designs и наши продукты все эти годы.
    Всё что мы от вас хотим – не перепродавать этот компонент (включение его в ваши проекты только приветствуется). И ещё мы попросим вас добавить ссылку на наш веб-сайт в вашем окне «Об авторе» или на всплывающем экране.

    Для тех из вас, кому нравится ковыряться в исходниках, мы можем предложить пойти по ссылке «Цены». Компонент написан на VB.NET и легко поддаётся модификации. Кроме того, это хороший учебник по написанию .NET-компонента.

    Почему мы использовали VB.NET? Да потому, что компонент написанных на C# просто валом, также как и примеров в Сети, а VB.NET в этом деле пасёт задник. Именно поэтому мы захотели показать всем, что качественный компонент может быть разработан и на VB.NET – этот пример и для тех софт-контор, в составе которых нет разработчиков на C#.

    Надеемся, что вы получите удовольствие, используя ezGrid.

    Особенности

    • Лёгкость использования
    • Ячейки с гиперссылками
    • Ячейки с ниспадающими списками и календарём
    • Ячейки с Progressbar (пусть будет строкой прогресса)
    • Ячейки, защищённые паролем
    • Темы для заголовков, ячеек, границ таблицы
    • Свойства для центрирования текста в ячейке – каждая ячейка является уникальным объектом
    • Множество настроек шрифтов для заголовков и ячеек таблицы
    • Автонумерация строк
    • Множество событий, происходящих перед и после изменений
    • Сортировка по столбцам
    • Изменение размеров колонки и строки
    • Сворачивание слов в ячейке и заголовке
    • Ниспадающий список не создаст проблему потери фокуса
    • Заполнение в коде ниспадающих списков ячеек
    • Редактирование в ячейке
    • И много, много другого

    (Ну что вам сказать? Если компонент соответствует заявленному хотя бы на 75%, да ещё и стабилен в работе, то его просто надо попробовать, хоть он и написан на VB.Net ;) Кстати, может быть кто-то из вас опробует его, пришлите впечатления, не сочтите за труд, а то у меня могут до него не дойти руки :( - Прим. автора.)

  5. Вышел набор компонент Shell MegaPack.Net для Windows Forms
    Sky Software объявила о выходе набора компонент Shell MegaPack.Net, .NET-близнеца набора компонент Shell MegaPack ActiveX. Компоненты для просмотра папок в виде дерева, просмотра содержимого папки и ниспадающего списка для выбора диска, позволят вам добавить настраиваемую функциональность Проводника Windows в ваше приложение Windows Forms разработанное на VC#, VB.NET или Managed C++, включая различные стили просмотра, поддержку технологии drag-drop, контекстные меню и т.п.
    Дата выхода: 8.01.2004

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

C# vs Java vs C++ :: продолжение, начало см. в №2

Сравнительный обзор C#

ЯЗЫК: C#
Автор: Ben Albahari
Компания: Genamics
Дата: 31.07.2000, обновлено 10 Августа 2000.
Благодарности, в алфавитном порядкеy: Don Box, C.R. Manning, Joe Nalewabau, John Osborn, Thomas Rhode и Daryl Richter за их отзывы и поддержку

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


Содержание

  1. C# и Java
  2. Свойства
  3. Индексаторы
  4. Делегаты
  5. События
  6. Перечисления
  7. Коллекции и Foreach
  8. Структуры
  9. Унификация типов
  10. Перегрузка операторов
  11. Полиморфизм
  12. Интерфейсы
  13. Версионность
  14. Модификаторы параметров
  15. Атрибуты
  16. Конструкции выбора
  17. Предопределённые типы
  18. Модфикаторы полей
  19. Конструкции перехода
  20. Сборки, пространства имён, уровни доступа
  21. Действия с указателями
  22. Прямоугольные массивы
  23. Конструкторы и деструкторы
  24. Управляемая среда выполнения
  25. Библиотеки
  26. Интероперабельность
  27. Выводы
6. Перечисления (Enums)
В том случае, если вы не знаете языка C, я скажу вам, что перечисления позволят вам определить группу объектов, например:
Объявление:

public enum Direction {North, East, West, South};

Использование:

Direction wall = Direction.North;

Это красивая конструкция, поэтому правильнее будет спросить не почему разработчики языка C# решили включить эту конструкцию в язык, а скорее почему разработчики Java решили не включать её в язык Java? Используя Java вы должны писать так:
Объявление:

public class Direction {
public final static int NORTH = 1;
public final static int EAST = 2;
public final static int WEST = 3;
public final static int SOUTH = 4;
}

Использование:

int wall = Direction.NORTH;

Несмотря на то, что язык Java выдержал больше редакций, он всё же является менее типобезопасным или корректным к использованию типов (type-safe), позволяя вам нечаянно присвоить переменной типа int значения, выходящие за границы типа (т.е. имеется ввиду значений перечисления), без возражений компилятора. Одним из преимуществ C# вы получаете при отладке кода – если вы установите точку останова на перечислении, которое содержит комбинированные перечисления, отладчик автоматически расшифрует код, для того, чтобы представить вам читаемый вывод:
Объявление:

public enum Direction {North=1, East=2, West=4, South=8};

Использование:

Direction direction = Direction.North | Direction.West;
if ((direction & Direction.North) != 0)
....

Если вы установите точку останова на конструкции if, вы получите вполне читаемый выводнаправления, а не число 5.

Одной из возможных причин отсутствия перечислений в Java может быть та, что вы можете использовать вместо них классы. Однако, как я говорил выше, только с помощью классов вы не сможете так отобразить особенности окружающего мира, как мы могли бы это сделать с помощью другой конструкции. Какие же примущества философии Java "если это может быть сделано с помощью класса, не следует вводить новой конструкции"? Похоже, наибольшим преимуществом будет простота – более короткий цикл обучения и ограждение программистов от многостороннего подхода к реализации своих идей. В действительности, язык Java во многом усовершенствовал C++ с точки зрения упрощения, такого как упразднение указателей, файлов заголовков и введение иерархии с одним корневым объектом. Однако, общим подходом всех этих упрощений стало то, что процесс кодирования (ух!) стал проще. Мы же рассмотрели конструкции – перечисления, свойства и события, которые, в конце концов, делают нашу работу сложнее.

7. Колллекции и конструкция Foreach

C# предлагает нам короткий вариант циклов for, который также предлагает улучшенное (да и просто красивое) взаимодействие с классами коллекций:

В Java или C++:

1. while (! collection.isEmpty()) {
Object o = collection.get();
collection.next();
...
2. for (int i = 0; i < array.length; i++)
...

В C#:

1. foreach (object o in collection)...
2. foreach (int i in array)...

Этот цикл C# будет работать с коллекциями объектов. Объект коллекции имеет метод GetEnumerator(), который возвращает объект Enumerator. Объект Enumerator имеет метод MoveNext и свойство Current.

8. Структуры

Полезно рассматривать структуры в языке C#, как конструкции, которые заставляют элегантно работать систему типов C#, а не как "один из способов писать реально эффективный код, если это вам вообще нужно".
В C++, как структуры(structs), так и классы(объекты) могут быть размещены в стеке/in-line или в куче. В C#, структуры всегда создаются в стеке stack/in-line, а классы(объекты) всегда создаются в куче. В действительности структуры позволяют создать более эффективный код:

public struct Vector {
public float direction;
public int magnitude;
}

Vector[] vectors = new Vector [1000];

Таким образом мы выделим память для всех 1000 векторов одним куском, что более эффективно, чем объявить структуру Vector как класс использовать цикл for для инициализации 1000 объектов этого класса (Хотя если вы читали вступление рассылки, то наверняка помните, что этого цикла можно избежать, хотя тут речь не об этом. – Прим. переводчика.). То, что мы так эффективно сделали, очень похоже на объявление массива целых также, как это делаится и в C# и в Java:

int[] ints = new ints [1000];

На самом деле C# просто разрешает вам расширить набор примитивных типов, встроенных в язык. Более того, на самом деле, C# реализует все примитивные типы как структуры (struct). Тип int фактически является псевдонимом структуры System.Int32, тип long – это псевдоним структуры System.Int64 и т.д. Эти примитивные типы, естественно, специальным образом обрабатываются компилятором, однако сам язык не делает таких различий. В следующем параграфе мы покажем, какие преимущества получает от этого C#.

9. Унификация типов

Большинство языков имеют притивные типы (int, long, и т.д.), и типы более высокого уровня, которые в конечном счёте состоят из примитивных типов. Однако часто полезно иметь возможность интерпретировать примитивные типы и типы более сложные как-то однообразно. Например, хорошо было бы иметь возможность создавать коллекции, которые могли бы содержать как целые, так и строки. Smalltalk добивается этого жертвуя некоторой эффективностью и рассматривая типы int и long как типы String или Form. Java пытается избежать таких жертв и представляет примитивные типы также, как и C или C++, предлагая сопутствующие классы-обёртки для каждого примитивного типа – для int это Integer, для double это Double. Шаблоны C++ позволяют написанному коду принимать любой тип, до тех пор, пока операции, производимые над этим типом поддерживаются самим типом.

C# предлагает другое решение проблемы. В предыдущем параграфе мы рассматривали структуры(struct) C#, рассказывая о том, что примитивные типы (вроде int) являются практически псевдонимами к структурам. Именно поэтому возможен такой код, поскольку структуры могут иметь те же методы, что и объекты класса:

int i = 5;
System.Console.WriteLine (i.ToString());

Если мы хотим использовать структуру как объект, то C# позволяет нам упаковать(box) структуру в объект с последующей распаковкой (unbox) структуры по мере надобности:

Stack stack = new Stack ();
stack.Push (i); // упаковка int
int j = (int) stack.Pop(); // распаковка int

Кроме приведения типов во время распаковки структуры есть ещё одна неочевидная связь между классами и структурами. Вы должны представлять себе и помнить, что упаковка влечёт за собой создание объекта-обёртки, так что CLR должна may обеспечивать дополнительную оптимизацию для упакованных объектов.

Создатели языка C# должно быть подумывали над введением шаблонов в язык во время его разработки. Я думаю было 2 главных причины для НЕ использования шаблонов. Первая причина – возможный беспорядок- шаблоны трудно вписать в объектно-ориентированную парадигму, они предлагают слишком много ope (сбивающих с толку) возможностей для дизайна программисту. Кроме того, с ними тяжело работать отражениям (reflection). Второй причиной может быть то, что они были бы малополезны, если бы в библиотеках .NET, такие как классы как колллекции, не использовали их. Однако, если классы .NET использовали бы их, то более чем 20+ языков, использующих .NET классы, должны были бы тоже работать с шаблонами, чего чисто технически было бы тяжело добиться.
Интересно заметить, что щаблоны (в виде generics) рассматриваются к включению в язык Java сообществом Java Community Process. Похоже, что компании начали петь свои любимые песни - Sun говорит о том, что ".NET страдает от синдрома наименьшего общего знаменателя", a Microsoft говорит о том, что "Java не имеет кросс-языковой поддержки".
(Поправка от 10 Августа) Из интервью с Anders’ом Hejlsberg’ом ясно, что шаблоны уже на горизонте, но будут выпущены не в первой редакции из-за сложностей, указаных выше (как мы знаем, согласно спецификации C# 2.0 обзавёлся generics – Прим.переводчика.). Было интересно увидеть, что спецификации IL были написаны так, что код IL мог бы использовать шаблоны (используя недеструктивный путь так, чтобы отражение работало хорошо), а байт-код шаблоны использовать не может. Также я даю вам ссылку на сайт сообщества Java Community Process, где обсуждается возможность введения шаблонов(generics):

Интервью с Anders Hejlsberg и Tony Goodhew
Процесс сообщества Java по добавлению Generics в Java

10. Перегрузка опреаторов

Перегрузка опреаторов позволяет программистам задавать типы так, чтобы с ними было также удобно работать, как и с примитивными (простыми) типами (int, long, и т.д.). C# реализует более строгую перегрузку операторов, чем C++, однако позволяя классам, такому как типичный в данном случае пример – класс, представляющий комплексные числа - работать нормально.

В C#, оператор == не является виртуальным (операторы не могут быть виртуальными) методом объекта класса, который сравнивает два объекта по ссылке. Когда вы строите класс, вам надо определить свой оператор ==. Если вы используете свой класс с коллекциями, тогда нужно реализовать интерфейс IComparable. Этот интерфейс имеет единственный метод для реализации, называемый методом CompareTo (object). Он должен возвращать позитивное, негативное или 0, если "this" больше, меньше или имеет такое же значение, что и объект. Можно определить <, методы <=, >=, >, если вы хотите предложить пользователям своего класса более удачный синтаксис. Числовые типы (int, long, и т.д.) реализуют интерфейс IComparable.
Вот простой пример реализации операторов:

public class Score : IComparable
{ int value;

public Score (int score) {
value = score;
}

public static bool operator == (Score x, Score y) {
return x.value == y.value;
}

public static bool operator != (Score x, Score y) {
return x.value != y.value;
}

public int CompareTo (object o) {
return value - ((Score)o).value;
}
}

Score a = new Score (5);
Score b = new Score (5);
Object c = a;
Object d = b;

Для сравнения a и b по ссылке:

System.Console.WriteLine ((object)a == (object)b; // false

Для сравнения a и b по значению:

System.Console.WriteLine (a == b); // true

Для сравнения c и d по ссылке:

System.Console.WriteLine (c == d); // false

Для сравнения c и d по значению:

System.Console.WriteLine (((IComparable)c).CompareTo (d) == 0); // true

Вы можете сами добавить операторы <, <=, >=, > к классу score. C# во время компиляции убеждается в том, что операторы, логически являющиеся парами (!= и ==, > и <, >= и <=), оба определены.

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

Время кода

Отображение DataGrid’a в маленькой области экрана без использования разбиения на страницы.

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

Вступление

Разбиение на страницы – одна из наиболее часто используемых свойств элемента управления DataGrid. У этого свойства есть следующие преимущества:
  • Отображение небольшого количества данных из большого набора
  • Экономия места в окне браузера, благодаря разбивке на страницы
    Однако разбиение на страницы вынуждает нас выполнять postback каждый раз при каждой смене страницы. Представьте, что вам нужно отобразить набор данных в 100 записей. На самом деле это не такой уж и большой объём для таких приложений, которые мы разрабатываем. Поэтому необходимость в использовании разбиения на страницы сомнительна. Однако отображение на одной странице 100 записей одновременно будет означать неэкономное отношение к оконному пространству. Итак – с одной стороны разбиение на страницы вроде бы не нужно, а с другой 100 отображаемых записей отбирают слишком много места. Как выйти из этой ситуации? Читаем дальше…

Создание веб-формы с DataGrid

Сначала создадим веб-форму с DataGrid’ом, привязанным к таблице БД. Назовём файл WebForm1.aspx. Выглядит это так:

<HTML>
<HEAD>
<title>WebForm1</title>
</HEAD>
<body>
<form id="Form2" method="post" runat="server">
<asp:DataGrid id="DataGrid1" runat="server">
</asp:DataGrid>
</form>
</body>
</HTML>

В обработчике события Page_Load привяжем DataGrid как обычно:

string connstr = "Integrated Security=SSPI;Initial Catalog=Northwind; Data Source=SERVER\NetSDK";
SqlConnection con = new SqlConnection(connstr);
SqlDataAdapter da = new SqlDataAdapter("select * from employees", con);
DataSet ds = new DataSet();
da.Fill(ds, "employees");
DataGrid1.DataSource = ds;
DataGrid1.DataMember = “employees”;
DataGrid1.DataBind();

Создание веб-формы, содержащей этот DataGrid

Теперь создадим главную форму, в которой и будут отображаться данные (назовём её DataGridHost.aspx). Используем тэг IFRAME языка HTML, который будет ссылаться на WebForm1, которую мы разработали предварительно. Код:

<%@ Page Language="c#"%>
<html>
<head>
<title>DataGridHost</title>
</head>
<body>
<iframe src="webform1.aspx">
</iframe>
</body>
</html>

Эта веб-форма может содержать и другие элементы управления, так же, как и обычная веб-форма. Как только эта форма будет выведена в окне браузера, DataGrid из WebForm1 также будет показана в рамках тэга IFRAME. Заметьте, что тэг IFRAME является специфичным для Internet Explorer, кроме того он ещё имеет некоторые дополнительные атрибуты, например width и height, которые могут помочь вам управлять шириной и высотой окна отображения соответственно. Эта веб-форма может содержать и другие элементы управления, так же, как и обычная веб-форма. Как только эта форма будет выведена в окне браузера, DataGrid из WebForm1 также будет показана в рамках тэга IFRAME. Заметьте, что тэг IFRAME является специфичным для Internet Explorer, кроме того он ещё имеет некоторые дополнительные атрибуты, например width и height, которые могут помочь вам управлять шириной и высотой окна отображения соответственно.

Вот, собственно, и всё.

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

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

ADO: Fetch u Cancel
Доступ с КПК к MSSQL server 
Как отобразить дату?
Вопрос: Event Log и XP ....  Проблема с DHTMLEdit компонетом 
WebDAV или как правильно создать библиотеку документов 
Конект с базой 
Как сделать TreeView прорачным?



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

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


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

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

В избранное