Файл: Справочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги.doc
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.01.2024
Просмотров: 945
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
ГЛАВА 7 Ввод и вывод табличных данных. Решение системы уравнений
Пример 44. Формирование таблицы. Функция String.Format
При создании инженерных, экономических и других приложений часто задача сводится к вводу данных, расчету (обработке введенных данных), а затем — выводу результатов вычислений в таблицу. В этом разделе мы обсудим такую типичную задачу: как оптимально сформировать таблицу, а затем вывести ее на экран с возможностью печати на принтере.
Чтобы выразительно показать именно процесс формирования таблицы, абстрагируемся от ввода данных и расчетов и сосредоточимся только на сути. Например, пусть мы имеем информацию о телефонах наших знакомых, и нам хотелось бы представить эту информацию в виде наглядной таблицы. Предположим, что результаты обработки записаны в два массива: массив имен знакомых imena и массив телефонов Tel. Наша программа формирует таблицу из этих двух массивов в текстовом поле TextBox. Кроме того, в программе участвует элемент управления MenuStrip для организации раскрывающегося меню, с помощью которого пользователь выводит сформированную таблицу в Блокнот (notepad.exe) с целью последующей корректировки (редактирования) и вывода на печать.
Таким образом, новый проект будет содержать форму, текстовое поле TextBox со свойством Multiline = true и меню MenuStrip. Текст программы представлен в листинге 7.1.
Листинг 7.1. Формирование таблицы
// Программа формирует таблицу из двух строковых массивов в текстовом поле,
// используя функцию String.Format. Кроме того, в программе участвует
// элемент управления MenuStrip для организации выпадающего меню,
// с помощью которого пользователь выводит сформированную таблицу
//в Блокнот с целью последующего редактирования и вывода на печать
using System;
using System.Windows.Forms;
// Другие директивы using удалены, поскольку они не используются в данной программе
namespace ТаблТxt
{
public partial class Form1:Form
{
public Form1()
{
InitializeComponent();
this.textBox1.Multiline = true;
this.textBox1.Size = new System.Drawing.Size(320, 216);
this.Text = "Формирование таблицы";
String[] Imena = {"Андрей - раб", "Света-X", "ЖЭК", "Справка по тел", "Александр Степанович", "Мама - дом", "Карапузова Таня", "Погода сегодня", "Театр Браво"};
String[] Tel = {"274-88-17","+38(067)7030356", "22-345-72", "009", "223-67-67 доп 32-67", "570-38-76", "201-72-23-прямой моб", "001", "216-40-22"};
textBox1.ScrollBars = ScrollBars.Vertical;
textBox1.Font e new System.Drawing.Font("Courier New", 9.0F);
textBox1.Text = "ТАБЛИЦА ТЕЛЕФОНОВ\r\n\r\n";
for (int i = 0; i <= 8; i++)
textBox1.Text += String.Format(
"{0, -21} {1, -21}", Imena[i], Tel[i]) + "\r\n";
textBox1.Text += "\r\nПРИМЕЧАНИЕ:" + "\r\пдля корректного отображения таблицы" +
"\r\nв Блокноте укажите шрифт Courier New";
// Запись таблицы в текстовый файл C:\Table.txt.
// Создание экземпляра StreamWriter для записи в файл
var Писатель = new System.10.StreamWriter(@"С:\Table_CS.txt", false
System.Text.Encoding.GetEncoding(1251));
// - здесь заказ кодовой страницы Win1251 для русских букв
Писатель.Write(textBoxl.Text);
Писатель.Close();
}
private void показатьТаблицуВБлокнотеТооlStripMenuItem_Click(object sender, EventArgs e)
{
try
{
System.Diagnostics.Process.Start("Notepad", @"C:\Table.txt");
}
catch (Exception Ситуация)
{ // Отчет об ошибках
MessageBox.Show(Ситуация.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
private void выходToolStripMenuItem_Click(object sender, EventArgs e)
{ // Выход из программы:
this.Close();
}
}
}
Чтобы в текстовом поле TextBox таблица отображалась корректно, мы заказали шрифт Courier New. Особенность этого шрифта заключается в том, что каждый символ (буква, точка, запятая и др.) этого шрифта имеет одну и ту же ширину, как это было на печатающей машинке. Поэтому, пользуясь шрифтом Courier New, удобно строить таблицы. Таким же замечательным свойством обладает, например, шрифт Consolas.
Далее в пошаговом цикле for мы использовали оператор +=, он означает: сцепить текущее содержание текстовой переменной textBox1.Text с текстом, представленным справа. Функция String.Format возвращает строку, сформированную по формату. Формат заключен в кавычки. Ноль в первых фигурных скобках означает: вставить вместо нуля переменную Imena[i], а единица во вторых фигурных скобках— вставить вместо единицы строку Tel[i]. Число 21 означает, что длина строки в любом случае будет состоять из 21 символа (недостающими символами будут пробелы), причем знак "минус" заставляет прижимать текст влево. Символы "\r\n" означают, что следует начать текст с новой строки. Внешний вид таблицы в текстовом поле формы показан на рис. 7.1.
После формирования всех строк textBox1.Text записываем их в текстовый файл C:\Table.txt через StreamWriter с кодовой таблицей Windows 1251. Подробное обсуждение этого фрагмента программы читатель может посмотреть в примере 24 (см. главу 4).
При выборе пользователем пункта меню Показать таблицу в Блокноте система создает событие, которое обрабатывается в соответствующей процедуре. Здесь вызываем программу операционной системы Блокнот (notepad.exe) для открытия файла C:\Table.txt (см. рис. 7.2).
Убедиться в работоспособности программы можно, открыв решение ТаблТхt.sIn в папке ТаблТхt.
Рис. 7.1. Таблица из двух массивов в текстовом поле.
Рис. 7.2. Просмотр созданной таблицы в Блокноте
Пример 45. Форматирование Double-переменных в виде таблицы. Вывод таблицы на печать. Поток String/Reader
Данная программа решает похожую задачу, однако в результате вычислении не строковые переменные string, а два массива переменных с двойной точностью Double. Например, пусть в результате расчетов получены координаты точек на местности Xи Y. Эти координаты необходимо оформить в виде таблицы. Таблицу следует назвать "Каталог координат". Координаты в таблице должны быть округлены до 2-х знаков после запятой. Сформированную таблицу следует показать пользователю в тексховом поле TextBox. Далее надо организовать возможность распечатать таблицу на принтере. Заметьте, что в этой задаче мы решаем проблемы без использования Блокнота.
Для решения этой задачи, также как и в предыдущем разделе, в форме с помощью панели элементов управления Toolbox создадим текстовое поле TextBox, выберем элементы управления MenuStip и PrintDocument. На вкладке Design подготовим пункты меню Печать и Выход так, как показано на рис. 7.3. Непосредственно текст программы представлен в листинге 7.2.
Листинг 7.2. Формирование таблицы и вывод ее на печать
// Программа формирует таблицу на основании двух массивов переменных
// сдвойной точностью. Данную таблицу программа демонстрирует пользователю
//в текстовом поле TextBox. Есть возможность распечатать таблицу на принтере
using System;
using System.Windows.Forms;
// Другие директивы using удалены, поскольку они не используются в данной программе
namespace TablTxtPrint
{
public partial class Form1:Form
{
System.IO.StringReader Читатель;
public Form1()
{
InitializeComponent();
this.Text = "Формирование таблицы";
Double[] X = {5342736.17653, 2345.3333, 234683.853749, 2438454.825368, 3425.72564, 5243.25, 537407.6236, 6354328.9876, 5342.243};
Double[] Y = {27488.17, 3806703.356, 22345.72, 54285.34, 2236767.3267, 57038.76, 201722.3, 26434.001, 2164.022};
textBox1.Multiline = true;
textBox1.ScrollBars = ScrollBars.Vertical;
textBox1.Font = new System.Drawing.Font("Courier New", 9.0F);
textBox1.Text = "КАТАЛОГ КООРДИНАТ\r\n";
textBox1. Text += " \r\n";
textBox1.Text += "|Пункт| X | У |\r\n";
textBox1. Text += " - \r\n";
for (int i = 0; i <= 8; i++)
textBox1.Text += String.Format(
"I {0,3:D} I {1,10:F2} | {2,10:F2} |", i, X[i], Y[i]) + "\r\n".
textBox1. Text += " \r\n";
}
private void печатьToolStripMenuItem_Click(object sender, EventArgs e)
{ // Пункт меню "Печать"
try
{ // Создание потока Читатель для чтения из строки:
Читатель = new System. IO.StringReader(textBox1.Text) ;
try
{ printDocumentl.Print(); }
finally
{ Читатель.Close(); }
}
catch (Exception ex)
{ MessageBox.Show(ex.Message); }
}
private void выходToolStripMenuItem_Click(object sender, EventArgs e)
{ // Выход из программы this.Close();
}
}
}
Как видно, формирование таблицы также происходит в цикле for с помощью функции String.Format. В фигурных скобках числа 0, 1 и 2 означают, что вместо фигурных скобок следует вставлять переменные i, x[i], y[i]. Выражение "3:D” означает, что переменную i следует размещать в трех символах по формату целых переменных "D". Выражение "10:F2" означает, что переменную x(i) следует размещать в десяти символах по фиксированному формату с двумя знаками после запятой.
При обработке события "щелчок на пункте меню" Печать (см. рис. 7.3) в блоках try.. .finaiy.. .catch создаем поток читатель, однако не для чтения из файла, а для чтения из текстовой переменной textBox1.Text. В этом случае мы обращаемся с потоком Читатель так же, как при операциях с файлами, но совершенно не обращаясь к внешней памяти (диску). Поэтому организация многостраничной печати остается абсолютно такой же, как в примере 29 (см. главу 4).
Как видно из приведенной программы, для того чтобы просмотреть, откорректировать и распечатать на принтере таблицу (инженерных или экономических вычислений), совершенно необязательно записывать эту таблицу в текстовый файл И читать его Блокнотом.
Рис. 7.3. Вывод таблицы в текстовое поле
Убедиться в работоспособности программы можно, открыв соответствующее решение в папке ТаблТхtPrint.
Пример 46. Вывод таблицы в Internet Explorer
Приведем несколько необычный подход к выводу таблицы для целей ее просмотра и распечатывания на принтере. Запишем таблицу в текстовый файл в формате
HTML, затем прочитаем ее с помощью обозревателя (браузера) Web-страниц Internet Explorer. HTML (HyperText Markup Language, язык гипертекстовой разметки)— специальные инструкции браузеру, с помощью которых создаются Web-страницы. То есть Web-страницы — это документы в формате HTML, содержащие текст и специальные теги (дескрипторы) HTML. По большому счету теги HTML необходимы для форматирования текста (т. е. придания ему нужного вида), который "понимает" браузер. Документы HTML хранятся в виде файлов с расширением htm или html. Теги HTML сообщают браузеру информацию о структуре и особенностях форматирования Web-страницы. Каждый тег содержит определенную инструкцию и заключается в угловые скобки (<>).
Приведем пример простейшей таблицы, записанный на языке HTML (листинг 7.3).
Листинг 7.3. Представление таблицы на языке HTML
Вообще говоря, если строго придерживаться правил языка HTML, то сначала следует написать теги <html>, <head>, <title> и т.д. Однако современные браузеры понимают и такую разметку, которая приведена в листинге 7.3. В нашем примере даже не указан ни один закрывающий тег для <tr> (тег, задающий строку в таблице) и для <td> (тег, задающий ячейку в таблице). Очень полезно будет читатели набрать приведенный нами пример в Блокноте, как-нибудь назвать этот файл с расширением htm и открыть его в каком-либо браузере Internet Explorer, MoziU Firefox или другом обозревателе. Также поучительно открыть этот файл в редакторе HTML Microsoft Office FrontPage и проследить, как меняется HTML форматирование при тех или иных изменениях, сделанных в таблице.
Наша программа имеет данные, уже знакомые читателю из примера 44. Эти данные находятся в двух массивах: Imena и Tel. На основании этих двух массивов программа формирует таблицу в формате HTML, т. е. создает текстовый файл (в нашей программе он называется C:\Tab1_tel.htm), а затем открывает этот файл браузером Internet Explorer. Текст программы приведен в листинге 7.4.
Листинг 7.4. Вывод таблицы в Internet Explorer
// Вывод таблицы в Internet Explorer. Здесь реализован несколько необычный
Пример 44. Формирование таблицы. Функция String.Format
При создании инженерных, экономических и других приложений часто задача сводится к вводу данных, расчету (обработке введенных данных), а затем — выводу результатов вычислений в таблицу. В этом разделе мы обсудим такую типичную задачу: как оптимально сформировать таблицу, а затем вывести ее на экран с возможностью печати на принтере.
Чтобы выразительно показать именно процесс формирования таблицы, абстрагируемся от ввода данных и расчетов и сосредоточимся только на сути. Например, пусть мы имеем информацию о телефонах наших знакомых, и нам хотелось бы представить эту информацию в виде наглядной таблицы. Предположим, что результаты обработки записаны в два массива: массив имен знакомых imena и массив телефонов Tel. Наша программа формирует таблицу из этих двух массивов в текстовом поле TextBox. Кроме того, в программе участвует элемент управления MenuStrip для организации раскрывающегося меню, с помощью которого пользователь выводит сформированную таблицу в Блокнот (notepad.exe) с целью последующей корректировки (редактирования) и вывода на печать.
Таким образом, новый проект будет содержать форму, текстовое поле TextBox со свойством Multiline = true и меню MenuStrip. Текст программы представлен в листинге 7.1.
Листинг 7.1. Формирование таблицы
// Программа формирует таблицу из двух строковых массивов в текстовом поле,
// используя функцию String.Format. Кроме того, в программе участвует
// элемент управления MenuStrip для организации выпадающего меню,
// с помощью которого пользователь выводит сформированную таблицу
//в Блокнот с целью последующего редактирования и вывода на печать
using System;
using System.Windows.Forms;
// Другие директивы using удалены, поскольку они не используются в данной программе
namespace ТаблТxt
{
public partial class Form1:Form
{
public Form1()
{
InitializeComponent();
this.textBox1.Multiline = true;
this.textBox1.Size = new System.Drawing.Size(320, 216);
this.Text = "Формирование таблицы";
String[] Imena = {"Андрей - раб", "Света-X", "ЖЭК", "Справка по тел", "Александр Степанович", "Мама - дом", "Карапузова Таня", "Погода сегодня", "Театр Браво"};
String[] Tel = {"274-88-17","+38(067)7030356", "22-345-72", "009", "223-67-67 доп 32-67", "570-38-76", "201-72-23-прямой моб", "001", "216-40-22"};
textBox1.ScrollBars = ScrollBars.Vertical;
textBox1.Font e new System.Drawing.Font("Courier New", 9.0F);
textBox1.Text = "ТАБЛИЦА ТЕЛЕФОНОВ\r\n\r\n";
for (int i = 0; i <= 8; i++)
textBox1.Text += String.Format(
"{0, -21} {1, -21}", Imena[i], Tel[i]) + "\r\n";
textBox1.Text += "\r\nПРИМЕЧАНИЕ:" + "\r\пдля корректного отображения таблицы" +
"\r\nв Блокноте укажите шрифт Courier New";
// Запись таблицы в текстовый файл C:\Table.txt.
// Создание экземпляра StreamWriter для записи в файл
var Писатель = new System.10.StreamWriter(@"С:\Table_CS.txt", false
System.Text.Encoding.GetEncoding(1251));
// - здесь заказ кодовой страницы Win1251 для русских букв
Писатель.Write(textBoxl.Text);
Писатель.Close();
}
private void показатьТаблицуВБлокнотеТооlStripMenuItem_Click(object sender, EventArgs e)
{
try
{
System.Diagnostics.Process.Start("Notepad", @"C:\Table.txt");
}
catch (Exception Ситуация)
{ // Отчет об ошибках
MessageBox.Show(Ситуация.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
private void выходToolStripMenuItem_Click(object sender, EventArgs e)
{ // Выход из программы:
this.Close();
}
}
}
Чтобы в текстовом поле TextBox таблица отображалась корректно, мы заказали шрифт Courier New. Особенность этого шрифта заключается в том, что каждый символ (буква, точка, запятая и др.) этого шрифта имеет одну и ту же ширину, как это было на печатающей машинке. Поэтому, пользуясь шрифтом Courier New, удобно строить таблицы. Таким же замечательным свойством обладает, например, шрифт Consolas.
Далее в пошаговом цикле for мы использовали оператор +=, он означает: сцепить текущее содержание текстовой переменной textBox1.Text с текстом, представленным справа. Функция String.Format возвращает строку, сформированную по формату. Формат заключен в кавычки. Ноль в первых фигурных скобках означает: вставить вместо нуля переменную Imena[i], а единица во вторых фигурных скобках— вставить вместо единицы строку Tel[i]. Число 21 означает, что длина строки в любом случае будет состоять из 21 символа (недостающими символами будут пробелы), причем знак "минус" заставляет прижимать текст влево. Символы "\r\n" означают, что следует начать текст с новой строки. Внешний вид таблицы в текстовом поле формы показан на рис. 7.1.
После формирования всех строк textBox1.Text записываем их в текстовый файл C:\Table.txt через StreamWriter с кодовой таблицей Windows 1251. Подробное обсуждение этого фрагмента программы читатель может посмотреть в примере 24 (см. главу 4).
При выборе пользователем пункта меню Показать таблицу в Блокноте система создает событие, которое обрабатывается в соответствующей процедуре. Здесь вызываем программу операционной системы Блокнот (notepad.exe) для открытия файла C:\Table.txt (см. рис. 7.2).
Убедиться в работоспособности программы можно, открыв решение ТаблТхt.sIn в папке ТаблТхt.
Рис. 7.1. Таблица из двух массивов в текстовом поле.
Рис. 7.2. Просмотр созданной таблицы в Блокноте
Пример 45. Форматирование Double-переменных в виде таблицы. Вывод таблицы на печать. Поток String/Reader
Данная программа решает похожую задачу, однако в результате вычислении не строковые переменные string, а два массива переменных с двойной точностью Double. Например, пусть в результате расчетов получены координаты точек на местности Xи Y. Эти координаты необходимо оформить в виде таблицы. Таблицу следует назвать "Каталог координат". Координаты в таблице должны быть округлены до 2-х знаков после запятой. Сформированную таблицу следует показать пользователю в тексховом поле TextBox. Далее надо организовать возможность распечатать таблицу на принтере. Заметьте, что в этой задаче мы решаем проблемы без использования Блокнота.
Для решения этой задачи, также как и в предыдущем разделе, в форме с помощью панели элементов управления Toolbox создадим текстовое поле TextBox, выберем элементы управления MenuStip и PrintDocument. На вкладке Design подготовим пункты меню Печать и Выход так, как показано на рис. 7.3. Непосредственно текст программы представлен в листинге 7.2.
Листинг 7.2. Формирование таблицы и вывод ее на печать
// Программа формирует таблицу на основании двух массивов переменных
// сдвойной точностью. Данную таблицу программа демонстрирует пользователю
//в текстовом поле TextBox. Есть возможность распечатать таблицу на принтере
using System;
using System.Windows.Forms;
// Другие директивы using удалены, поскольку они не используются в данной программе
namespace TablTxtPrint
{
public partial class Form1:Form
{
System.IO.StringReader Читатель;
public Form1()
{
InitializeComponent();
this.Text = "Формирование таблицы";
Double[] X = {5342736.17653, 2345.3333, 234683.853749, 2438454.825368, 3425.72564, 5243.25, 537407.6236, 6354328.9876, 5342.243};
Double[] Y = {27488.17, 3806703.356, 22345.72, 54285.34, 2236767.3267, 57038.76, 201722.3, 26434.001, 2164.022};
textBox1.Multiline = true;
textBox1.ScrollBars = ScrollBars.Vertical;
textBox1.Font = new System.Drawing.Font("Courier New", 9.0F);
textBox1.Text = "КАТАЛОГ КООРДИНАТ\r\n";
textBox1. Text += " \r\n";
textBox1.Text += "|Пункт| X | У |\r\n";
textBox1. Text += " - \r\n";
for (int i = 0; i <= 8; i++)
textBox1.Text += String.Format(
"I {0,3:D} I {1,10:F2} | {2,10:F2} |", i, X[i], Y[i]) + "\r\n".
textBox1. Text += " \r\n";
}
private void печатьToolStripMenuItem_Click(object sender, EventArgs e)
{ // Пункт меню "Печать"
try
{ // Создание потока Читатель для чтения из строки:
Читатель = new System. IO.StringReader(textBox1.Text) ;
try
{ printDocumentl.Print(); }
finally
{ Читатель.Close(); }
}
catch (Exception ex)
{ MessageBox.Show(ex.Message); }
}
private void выходToolStripMenuItem_Click(object sender, EventArgs e)
{ // Выход из программы this.Close();
}
}
}
Как видно, формирование таблицы также происходит в цикле for с помощью функции String.Format. В фигурных скобках числа 0, 1 и 2 означают, что вместо фигурных скобок следует вставлять переменные i, x[i], y[i]. Выражение "3:D” означает, что переменную i следует размещать в трех символах по формату целых переменных "D". Выражение "10:F2" означает, что переменную x(i) следует размещать в десяти символах по фиксированному формату с двумя знаками после запятой.
При обработке события "щелчок на пункте меню" Печать (см. рис. 7.3) в блоках try.. .finaiy.. .catch создаем поток читатель, однако не для чтения из файла, а для чтения из текстовой переменной textBox1.Text. В этом случае мы обращаемся с потоком Читатель так же, как при операциях с файлами, но совершенно не обращаясь к внешней памяти (диску). Поэтому организация многостраничной печати остается абсолютно такой же, как в примере 29 (см. главу 4).
Как видно из приведенной программы, для того чтобы просмотреть, откорректировать и распечатать на принтере таблицу (инженерных или экономических вычислений), совершенно необязательно записывать эту таблицу в текстовый файл И читать его Блокнотом.
Рис. 7.3. Вывод таблицы в текстовое поле
Убедиться в работоспособности программы можно, открыв соответствующее решение в папке ТаблТхtPrint.
Пример 46. Вывод таблицы в Internet Explorer
Приведем несколько необычный подход к выводу таблицы для целей ее просмотра и распечатывания на принтере. Запишем таблицу в текстовый файл в формате
HTML, затем прочитаем ее с помощью обозревателя (браузера) Web-страниц Internet Explorer. HTML (HyperText Markup Language, язык гипертекстовой разметки)— специальные инструкции браузеру, с помощью которых создаются Web-страницы. То есть Web-страницы — это документы в формате HTML, содержащие текст и специальные теги (дескрипторы) HTML. По большому счету теги HTML необходимы для форматирования текста (т. е. придания ему нужного вида), который "понимает" браузер. Документы HTML хранятся в виде файлов с расширением htm или html. Теги HTML сообщают браузеру информацию о структуре и особенностях форматирования Web-страницы. Каждый тег содержит определенную инструкцию и заключается в угловые скобки (<>).
Приведем пример простейшей таблицы, записанный на языке HTML (листинг 7.3).
Листинг 7.3. Представление таблицы на языке HTML
Aндрей - pa6 | 274-88-17 |
Cвета - X | +38 (067) 7030356 |
ЖЭК | 22-345-72 |
Cпpaвкa no Teл | 009 |
Вообще говоря, если строго придерживаться правил языка HTML, то сначала следует написать теги <html>, <head>, <title> и т.д. Однако современные браузеры понимают и такую разметку, которая приведена в листинге 7.3. В нашем примере даже не указан ни один закрывающий тег для <tr> (тег, задающий строку в таблице) и для <td> (тег, задающий ячейку в таблице). Очень полезно будет читатели набрать приведенный нами пример в Блокноте, как-нибудь назвать этот файл с расширением htm и открыть его в каком-либо браузере Internet Explorer, MoziU Firefox или другом обозревателе. Также поучительно открыть этот файл в редакторе HTML Microsoft Office FrontPage и проследить, как меняется HTML форматирование при тех или иных изменениях, сделанных в таблице.
Наша программа имеет данные, уже знакомые читателю из примера 44. Эти данные находятся в двух массивах: Imena и Tel. На основании этих двух массивов программа формирует таблицу в формате HTML, т. е. создает текстовый файл (в нашей программе он называется C:\Tab1_tel.htm), а затем открывает этот файл браузером Internet Explorer. Текст программы приведен в листинге 7.4.
Листинг 7.4. Вывод таблицы в Internet Explorer
// Вывод таблицы в Internet Explorer. Здесь реализован несколько необычный