69068

Основи прив’язки даних

Лекция

Информатика, кибернетика и программирование

Прив’язка даних – це засіб, який дозволяє асоціювати джерело даних з елементом керування з метою автоматичного відображення даних у цьому елементі керування. Ключовою характеристикою прив’язки даних є її декларативний, а не програмний характер.

Украинкский

2014-09-29

872.5 KB

2 чел.

Лекція №12

Основи прив'язки даних

Прив'язка даних – це засіб, який дозволяє асоціювати джерело даних з елементом керування з метою автоматичного відображення даних у цьому елементі керування. Ключовою характеристикою прив'язки даних є її декларативний, а не програмний характер. Це означає, що прив'язка даних визначена поза кодом програми, поряд з елементами керування на сторінці .aspx. Перевага такого підходу у тому, що він дозволяє досягти більш чіткого поділу між елементами керування та логікою коду Web-сторінки.

У ASP.NET більшість елементів керування (зокрема TextBox, LinkButton, Image та багато інших) підтримують прив'язку даних з одним значенням (single-value). Така прив'язка дозволяє зв'язати властивість елемента керування з джерелом даних, але елемент керування може відображати єдине значення. Властивість, яка прив'язується, не обов'язково має відображати щось видиме на сторінці. Наприклад, можна не тільки прив'язати текст гіперпосилання, встановивши властивість HyperLink.Text, але також прив'язати властивість NavigateUrl для специфікації цільового призначення посилання. Щоб використовувати прив'язку одного значення, створюється вираз прив'язки даних.

Багато елементів керування Web підтримують прив'язку з множиною значень (repeated-value); це означає, що вони можуть відображати набори елементів. Елементи керування можливістю прив'язки до множини значень включають списки і екранні таблиці (наприклад, ListBox та GridView). Якщо елемент керування підтримує таку прив'язку, він завжди має властивість DataSource, яка приймає об'єкт даних. При встановленні властивості DataSource створюється логічний зв'язок серверного елемента керування з об'єктом даних, який містить інформацію, що підлягає відображенню. Однак це безпосередньо не наповнює елемент керування даними. Щоб досягти цього, необхідний метод елемента керування DataBind(), який проходить в циклі по DataSource, витягує дані і оновлює сторінку. Прив'язка з множиною значень – найбільш потужний тип прив'язки.

Прив'язка одного значення. Елементи керування, які підтримують прив'язку даних в режимі одного значення, дозволяють прив'язати деякі з їх властивостей до виразу прив'язки даних. Це вираз вводиться в частині .аspx розмітки сторінки (не в полі коду) і розташовується між обмежувачами <%# та %>.

Ось приклад:

<%# Вираз_знаходиться_тут %>

Це може виглядати як блок сценарію, проте це не так. Якщо спробувати написати будь-який код всередині дескриптора, то отримається помилка. Єдине, що сюди можна помістити – це допустимий вираз прив'язки. Наприклад, якщо є загальнодоступна або захищена змінна в ім'ям EmployeeName, можна написати наступне:

<%# EmployeeName%>

Щоб обчислити вираз прив'язки на зразок цього, необхідно викликати у коді метод Page.DataBind(). При виклику Page.DataBind() ASP.NET перевіряє всі вирази на сторінці і замінює їх відповідними значеннями (у даному випадку – поточним значенням змінної EmployeeName). Якщо забути викликати метод DataBind(), вираз прив'язки не заповнить елемент керування – замість цього він буде просто відкинутий, коли сторінка буде перетворена у HTML.

Джерело для прив'язки одного значення може включати значення властивості, змінну-член або повернене значення функції (якщо властивість, змінна-член або функція має доступ типу protected або public). Це також може бути будь-який інший вираз, що обчислюється під час виконання, такий як посилання на властивість іншого елемента керування або результат обчислення з використанням літеральних значень і операцій з ними, тощо. Ось кілька прикладів коректних виразів прив'язки даних:

<%# GetUserName(ID)%>

<%# 1 + (2 * 20)%>

<%# "Іван" + "Іванов"%>

<%# Request.Browser.Browser%>

Можете розміщати вирази прив'язки даних практично у будь-якому місці сторінки, але зазвичай вираз прив'язки даних присвоюється властивості у керуючому дескрипторі. Розглянемо приклад сторінки, що використовує декілька виразів прив'язки даних:

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

   <title></title>

</head>

<body> 

<form id="Form1" method="post" runat="server"> 

<asp:Image ID="Image1" runat="server" ImageUrl ='<%# FilePath %>' /><br /> 

<asp:Label ID="Label1" runat="server" Text='<%# FilePath %>' /><br /> 

<asp:TextBox ID="TextBox1" runat="server" Text='<%# GetFilePath() %>' /><br /> 

<asp:HyperLink ID="HyperLink1" runat="server" 

 HavigateUrl='<%# LogoPath.Value %>' Font-Bold="True" Text="Show logo" /> 

<br />

<input type="hidden" ID="LogoPath" runat="server" value="cisterna_small.pgn"> 

   <b><%# FilePath %></b>

<br /> 

<img src='<%# GetFilePath() %>'> 

</form> 

</body> 

</html>

Як видно з лістингу, можна не лише прив'язати властивість Text елемента керування Label або TextBox, але також використовувати й інші властивості, такі як ImageURL елемента керування Image, NavigateUrl елемента керування HyperLink і навіть атрибут src статичного HTML-дескриптора <img>. Також можна помістити вираз прив'язки у будь-якому місці сторінки, не прив'язуючи його до жодної властивості або атрибуту. Наприклад, попередня Web-сторінка містить вираз прив'язки між дескрипторами <b> та </ b>. Під час обробки результуючий текст буде поміщений на сторінці і відображений напівжирним шрифтом. Можна навіть помістити вираз поза тегом <form>, але туди не можна буде вставити елементи керування серверної сторони.

Вирази у прикладі посилаються на властивість FilePath, функцію GetFilePath() і властивість Value прихованого поля серверної сторони, яке оголошено на тій же сторінці. Щоб завершити цю сторінку, слід визначити наступні інгредієнти в блоках сценаріїв або класі прихованого коду:

       protected string GetFilePath()

       {

           return "cisterna_small.png";

       }

       protected string FilePath

       {

           get { return "cisterna_small.png"; }

       }

У цьому прикладі властивість і функція повертають тільки жорстко закодовані рядки. Однак можна додати практично будь-який код С#, щоб динамічно генерувати значення для виразів прив'язки даних.

Важливо пам'ятати, що вирази прив'язки даних не встановлюють безпосередньо властивості, до яких вони прив'язані. Вони просто визначають з'єднання між властивістю елементу керування і деякої порцією інформації. Щоб змусити сторінку обчислити вираз, запустити відповідний код, присвоїти відповідне значення, необхідно викликати метод DataBind()сторінки, як показано нижче:

       protected void Page_Load(object sender, EventArgs e)

       {

           this.DataBind();

       }

На рис. 9.1 показано те, що можна буде побачити, запустивши цю сторінку.

Прив'язка множини значень. Прив'язка множини значень дозволяє прив'язати цілий список інформації до елемента керування. Цей список інформації представлений об'єктом даних, який є оболонкою колекції елементів. Це може бути колекція користувацьких об'єктів (наприклад, зі звичайними ArrayList або Hashtable).

ASP.NET включає кілька базових спискових елементів керування, які підтримують прив'язку множини значень:

 усі елементи керування, які генерують свій код з використанням дескриптора <select>, зокрема елементи керування HtmlSelect, ListBox та DropDownList;

 елементи керування CheckBoxList та RadloButtonList, що генерують кожен дочірній елемент у вигляді окремого прапорця або перемикача;

 елемент керування BulletedList, що створює список з мітками або пронумерованими пунктами.

Усі ці елементи керування відображають однозначне (single-value) поле властивості кожного елемента даних. У кожного з цих елементів керування є список властивостей, наведений в табл. 9.1.

Таблиця 9.1. Властивості даних для спискових елементів керування

Властивість

Опис

DataSource

Це об'єкт даних, що містить відображувані дані. Повинен реалізовувати підтримуваний інтерфейс – зазвичай ICollection.

DataSourceID

Встановивши цю властивість, замість програмного застосування об'єкта даних (використовуючи код) можна пов'язати списковий елемент керування з елементом-джерелом даних. Елемент-джерело даних згенерує необхідний об'єкт даних автоматично. Можна використовувати або властивість DataSource, або DataSourceID, але не обидві відразу.

DataTextField

Кожене джерело даних представляє колекцію елементів даних. Списковий елемент керування може відображати тільки одне значення з кожного елемента списку. DataTextField вказує стовпець (у разі рядка таблиці) або властивість (у разі об'єкта) елемента даних, які містять значення, що відображається на сторінці.

DataTextFormatString

Специфікує необов'язковий рядок формату, який елемент керування буде використовувати для форматування кожного DataTextValue перед його відображенням.

DataValueField

Ця властивість подібно DataTextField, але значення самого елемента даних на сторінці не відображається. Замість цього воно зберігається в атрибуті value дескриптора HTML. Це дозволяє витягти значення пізніше у коді застосування. Головне призначення цього поля – зберігати унікальний ідентифікатор або поле первинного ключа, щоб пізніше використати його для вилучення решти даних, коли користувач вибере конкретний елемент.

Усі спискові елементи керування, по суті, однакові. Єдина відмінність полягає у способі їх перетворення в HTML і у тому, чи дозволяють вони множинне виділення.

На рис. 9.2 показана тестова сторінка, яка відображає всі спискові елементи керування і текст, що містить поточний вибір.

Ці елементи керування оголошені таким чином:

<select runat="server" ID="Select1" size="3"  DataTextField="Key" DataValueField="Value" /> 

<select runat="server" ID="Select2" DataTextField="Key" DataValueField="Value" /> 

<asp:ListBox runat="server" ID="Listbox1" Size="3" DataTextField="Key" 

 DataValueField="Value" /> 

<asp:DropDownList runat="server" ID="DropdownList1" DataTextField="Key" 

 DataValueField="Value" /> 

<asp:RadioButtonList runat="server" ID="OptionList1" DataTextField="Key" 

 DataValueField="Value"/> 

<asp:CheckBoxList runat="server" ID="CheckList1" DataTextField="Key" 

DataValueField="Value" /> 

<br />

<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" /><br /> 

<asp:Label ID="LabelResult" runat="server" Text="Label"></asp:Label>

Останній елемент керування Label, відображає інформацію про обрані елементи.

Коли сторінка завантажується вперше, код створює джерело даних і присвоює його всім елементам керування. У даному прикладі об'єктом даних є колекція Hashtable, що містить серії рядків. Value елемента колекції Hashtable повертає актуальний текст елемента (використовуваний для DataTextField), в той час як Key елемента колекції Hashtable повертає ключ, яким елемент индексується. Код для створення і прив'язки колекції:

       protected void Page_Load(object sender, EventArgs e)

       {   if (!Page.IsPostBack)

           {   // Створити джерело даних

               Hashtable ht = new Hashtable();

               ht.Add("Лазанья ", "Key1");

               ht.Add("Спагетті", "Key2");

               ht.Add("Піца", "Key3");

               // Встановити властивість DataSource для елемента керування

               Select1.DataSource = ht;

               Select2.DataSource = ht;

               Listbox1.DataSource = ht;

               DropdownList1.DataSource = ht;

               CheckList1.DataSource = ht;

               OptionList1.DataSource = ht;

               Page.DataBind(); // Прив'язати елементи керування

           }}

Коли користувач клацає кнопку, код додає ім'я і значення вибраних елементів до мітки. Ось код, який виконує цю задачу:

       protected void Button1_Click(object sender, EventArgs e)

       {   LabelResult.Text = "У списку Select1 вибрано: " +

              Select1.Items[Select1.SelectedIndex].Text + " - " + Select1.Value + "<br />";

           LabelResult.Text += "У списку Select2 вибрано: " +

             Select2.Items[Select2.SelectedIndex].Text + " - " + Select2.Value + "<br />";

           LabelResult.Text += "У списку Listbox1 вибрано: " + Listbox1.SelectedItem.Text +

             " - " + Listbox1.SelectedItem.Value + "<br />";

           LabelResult.Text += "У списку DropdownList1 вибрано: " +

             DropdownList1.SelectedItem.Text + " - " + DropdownList1.SelectedItem.Value + "<br />";

           LabelResult.Text += "У списку OptionList1 вибрано: " +

             OptionList1.SelectedItem.Text + " - " + OptionList1.SelectedItem.Value + "<br />";

           LabelResult.Text += "У списку CheckList1 вибрано: ";

           foreach (ListItem li in CheckList1.Items)

           {

               if (li.Selected)

                   LabelResult.Text += li.Text + " - " + li.Value + " ";

           }

       }

Прив’язка DataReader. У попередньому прикладі в якості джерела даних використовується Hashtable. Звичайно базові колекції не єдиний вид джерел даних, які можна використовувати для прив'язки списків. Насправді можна прив'язувати будь-які структури даних, що реалізують інтерфейс ICollection або його похідні.

До таких класів даних належать:

• класи колекцій, що повністю містяться у пам'яті, наприклад, Collection, ArrayList, Hashtable та Dictionary;

• об'єкт ADO.NET DataReader, що представляє заснований на підключенні, односпрямований доступ до бази даних тільки для читання;

• об'єкт ADO.NET DataView, що представляє огляд окремого відключеного об'єкта DataTable;

• будь-який інший користувацький об'єкт, який реалізує інтерфейс ICollection.

Наприклад, уявіть, що необхідно заповнити вікно списка повними іменами усіх співробітників, що зберігаються у таблиці Employees бази даних Northwind. На рис. 9.3 показаний результат, який може при цьому вийти.

Інформація в цьому прикладі включає для кожної особи: титул для ввічливого звернення, ім'я та прізвище, які зберігаються у трьох різних полях. На жаль, властивість DataTextField очікує ім'я тільки одного поля.

Не можна використовувати прив'язку даних для з'єднання цих трьох фрагментів даних і створення значення для DataTextField. Однак можна вирішити цю проблему простим, але ефективним шляхом – використовуючи обчислюваний стовпець. Для цього потрібно просто модифікувати запит SELECT так, щоб він створював обчислюваний стовпець, що містить інформацію з цих трьох полів. Потім можна використати цей стовпець у DataTextField. Відповідна команда SQL має наступний вигляд:

SELECT EmployeeID, TitleOfCourtesy + ' ' +

FirstName + '' + LastName As FullName FROM Employees

Прив'язане до даних вікно списку оголошується на сторінці наступним чином:

Коли завантажується сторінка, вона витягає записи з бази даних і прив'язує їх до спискового елемента керування. У цьому прикладі використовується DataReader в якості джерела даних:

 

У наведеному прикладі створюються підключення до БД, команда, яка вибирає дані, відкриває з'єднання, виконує команду, що повертає DataReader. Повернений DataReader прив'язується до вікна списку, і в кінці DataReader і підключення закриваються. Зверніть увагу, що метод DataBind() сторінки або елементу керування повинен бути викликаний перед закриттям підключення. До того, як буде викликаний цей метод, дані вилучатись не будуть.

Остання частина цього прикладу – код для визначення обраних елементів:

protected void cmdGetSelection_Click (object sender, EventArgs e)

{

Result.Text + = "<b> Selected employees: </ b>";

foreach (ListItem li in lstNames.Items)

{ if (li.Selected)

Result.Text + = String.Format ("<li> ({0}) {1} </ li>", li.Value, li.Text);

}}

Якщо необхідно використати DropDownList, CheckListBox або RadioButtonList замість ListBox, то для цього достатньо змінити оголошення елемента керування. Інша частина коду, яка встановлює прив'язку даних, залишиться не змінною.

Розширені елементи керування даними. Надодачу до простих спискових елементів керування ASP.NET включає ряд розширених елементів керування даними для підтримки прив'язки множини значень. Такі елементи керування дещо відрізняються від спискових.

По-перше, вони спроектовані спеціально для прив'язки даних. До того ж вони володіють можливістю відображати кілька властивостей або стовпців кожного елемента даних, часто в табличній формі, або у відповідності з заданим шаблоном; вони підтримують високорівневі засоби на зразок редагування і надають кілька подій, які дозволяють в різних місцях втручатися в їх внутрішню роботу.

До розширених елементів керування відносяться наступні:

GridView – табличний елемент керування загального призначення для показу великих таблиць інформації. Підтримує вибір, редагування, сортування і переміщення по сторінках. GridView – "важковаговик" серед елементів керування ASP.NET. Він є нащадком DataGrid з ASP.NET 1.Х.

DetailsView – ідеальний вибір для показу одного запису за раз у таблиці, що має один рядок на поле. DetailsView підтримує редагування і, необов'язково, можливість переміщення по сторінках, що дозволяє переглядати послідовності записів.

FormView – як і DetailsView, FormView показує по одному запису за раз, підтримує редагування і представляє елементи керування "листанням" для переміщення по серіях записів. Відмінність полягає у тому, що FormView заснований на шаблонах, що дозволяє комбінувати поля набагато гнучкіше, не обов'язково на основі таблиці.

Крім перерахованих вище елементів керування, прив'язку даних підтримують ще деякі більш спеціалізовані елементи керування ASP.NET, зокрем Menu, TreeView та AdRotator.

Більш докладно розширені елементи керування даними розглядаються далі у лекції. Однак варто розглянути невеликий приклад застосування GridView.

Як і спискові елементи керування, GridView має властивість DataSourсе для об'єктів даних і метод DataBind(), який ініціює читання об'єкта даних і відображення кожного запису. Однак використовувати такі властивості, як DataTextField та DataValueField, вже не має необхідності, оскільки GridView автоматично генерує стовпці для кожної властивості (якщо прив'язка здійснюється до призначеного для користувача об'єкта) або для кожного поля (якщо прив'язка виконується до рядка). Наприклад, оголошено:

       <asp:GridView ID="GridView1" runat="server" />

Тепер визначимо запит, який вибере декілька стовпців із таблиці Employees:

               string sql = "SELECT Id, FirstName, LastName FROM Student";

Можна прив'язати GridView до DataReader так само, як прив'язувався списковий елемент керування у попередньому прикладі. Змінюється тільки ім'я елемента управління:

                   GridView1.DataSource = reader;

                   GridView1.DataBind();

На рис. 9.4 показаний GridView, створений цим кодом.

Рис. 9.4. Базовий зовнішній вигляд GridView

Звичайно, можна зробити багато більше для налаштування зовнішнього вигляду GridView, можна використати розширені засоби накшталт сортування, гортання сторінок і редагування. Далі розглядаються багато з засобів. Можна легко змінити зовнішній вигляд GridView, вказавши Auto Format в його інтелектуальному дескрипторі.

Прив'язка до DataView. Виконуючи прив'язку безпосередньо до DataReader, можна зіткнутися з декількома обмеженнями. Оскільки DataReader – односпрямований курсор, не вийде прив'язати дані до множини елементів керування. Також не можна застосувати налаштовувані "на льоту"сортування і фільтрацію. І, нарешті, якщо тільки ви не подбаєте закодувати сторінку, використовуючи узагальнені інтерфейси, такі як IDataReader, то обмежите дані тільки використовуваним в даний момент постачальником даних, що ускладнить модифікацію та адаптацію коду у майбутньому. Щоб вирішити ці проблеми, можна використовувати автономні об'єкти даних ADO.NET.

При заповненні автономного DataSet можна прив'язати його до одного або більше елементів керування і застосувати критерії сортування та фільтрації. До того ж DataSet є повністю узагальненим – незалежно від того, який постачальник даних використаний для його наповнення, сам DataSet (і код прив'язки даних) виглядає однаково.
Технічно, прив'язка ніколи не виконується до об'єкту
DataSet або DataTable. Замість відбувається прив'язка до об'єкта DataView. DataView представляє вид даних в специфічному DataTable. Це означає, що наступний код:

grid.DataSource = dataTable;

grid.DataBind ();

еквівалентний

grid.DataSource = dataTable.DefaultView;

grid.DataBind ();

Важливо відзначити, що кожен об'єкт DataTable включає об'єкт DataView за промовчанням, який представлений властивістю DataTable.DefaultView. Це дозволяє прив'язуватися безпосередньо до DataTable. І якщо це робити, ASP.NET, насправді, використовує автоматично DataView за промовчанням. DataView за промовчанням не застосовує сортування та не фільтрує записи. Щоб поекспериментувати з цими налаштуваннями, то можна конфігурувати DataView за промовчанням або створити власний і явно прив'язати його.

Елементи керування джерелами даних. На попередніх лекціях розглядалося, як можна безпосередньо підключитися до БД, виконати запит, пройти циклом по записах результуючого набору і відобразити їх на сторінці. Але існує більш простий вибір: прив'язка дозволяє написати логіку доступу до даних, а потім відобразити результати на сторінці без необхідності побудови циклу або маніпулювання елементами керування. Тепер саме час представити ще одне зручне нововведення – елементи керування джерелами даних. Завдяки їм, можна взагалі уникнути необхідності написання коду доступу до даних.

Примітка. Але існує відстань між тим, що можна робити, і тим, що слуд робити. У більш професійних, масштабних застосуваннях як і раніше доведеться писати і тонко налаштовувати код доступу до даних для досягнення оптимальної продуктивності, агрегування даних, обробки помилок, протоколювання тощо. Але навіть якщо робити все це, то все одно можна використовувати елементи керування джерелами даних. Лише не слід розраховувати, що вдасться взагалі уникнути написання коду.

Елементи керування джерелами даних включають будь-які елементи керування, що реалізують інтерфейс IDataSourсе. Середовище .NET Framework включає такі елементи керування джерелами даних:

SqlDataSourсe – це джерело даних дозволяє підключатися до будь-якого джерела даних, яке має постачальника даних ADO.NET. Сюди відносяться SQL Server, Oracle та OLE DB або ODBC. Використовуючи це джерело, не доведеться писати код доступу до даних.

ObjectDataSource – це джерело даних дозволяє підключатися до призначеного для користувача класу доступу до даних. Це підхід як найкраще підходить для широкомасштабних професійних Web-застосувань.

XmlDataSourсе – це джерело даних дозволяє підключатися до XML-файлу.

SiteMapDataSource – це джерело даних дозволяє підключатися до файлу Web.Sitemap, що описує навігаційну структуру Web-сайту.

Всі елементи керування джерелами даних можна знайти на вкладці Data панелі інструментів Visual Studio. Елементи керування джерелами даних – нововведення ASP.NET 2.0, і незабаром очікується поява нових, як від Microsoft, так і від незалежних розробників.

При перетягуванні елементу керування джерелом даних на Web-сторінку у Visual Studio він відображається у вигляді прямокутника сірого кольору. Однак цей прямокутник не з'явиться в браузері при запуску Web-застосування.

Рис. 9.5. Елемент керування джерелом даних під час проектування та виконання

Життєвий цикл сторінки з прив'язкою даних. Елементи керування джерелами даних можуть вирішувати два завдання:

• витягувати дані з джерела і застосовувати до пов'язаних елементів керування;

• оновлювати джерело даних, коли у пов'язаних елементах керування виконується редагування.

У ASP.NET 1.x створення пов'язаних з даними сторінок було ускладнено, оскільки необхідно було розуміти життєвий цикл сторінки, інакше існував ризик виконання прив'язки у неправильний момент. Звичайно, в ASP.NET 2.0, як і раніше, необхідно розуміти основи життєвого циклу сторінки, оскільки можна зіткнутися з ситуаціями, коли доведеться мати справу з розширеними моделями прив'язки даних. Наприклад, можна додати дані або набір вибраних елементів в елемент керування після того, як він буде прив'язаний до джерела даних. Залежно від сценарію, можна мати можливість реагувати на події елементів керування джерелами даних, але вони не завжди будуть порушуватися у точці, де потрібно застосувати бажану логіку.

Завдання прив'язки даних відбуваються у наступному порядку:

1. Створюється об'єкт сторінки.

2. Починається життєвий цикл сторінки, ініціюються події Page.Init та Page.Load.

3. Відбуваються всі інші події елементів керування.

4. Елементи керування джерелами даних виконують будь-які оновлення. Якщо оновлюється рядок, збуджуються події Updating та Updated, якщо рядок вставляється – події Inserting та Inserted, якщо рядок видаляється – Deleting та Deleted.

5. Збуджується подія Page.PreRender.

6. Елементи керування джерелами даних виконують необхідні запити і вставляють отримані дані в пов'язані елементи керування. Тут збуджуються події Selecting та Selected.

7. Сторінка відображається і розміщується.

SqlDataSource. Елементи керування джерелами даних з'являються у розмітці Web-сторінки подібно звичайним елементам керування, наприклад:

<asp:SqlDataSource ID = "SqlDataSource1" runat = "server" ... />

SqlDataSource представляє підключення до БД, яка використовує постачальника ADO.NET. Однак тут є пастка. SqlDataSource вимагає узагальненого способу створення об'єктів Connection, Command та DataReader, які йому потрібні. Єдиний спосіб зробити це – через фабрику постачальника даних. Фабрика відповідає за створення специфічних для постачальника даних об'єктів, яких потребує SqlDataSource для доступу до джерела даних.

Як ви знаєте, .NET поставляється з наступними чотирма фабриками постачальників:

• System.Data.SqlClient

• System.Data.OracleClient

• System.Data.OleDb

• System.Data.Odbc

Вони зареєстровані у файлі machine.config, в результаті, чого можна використовувати їх з SqlDataSource. Джерело даних вибирається установкою імені постачальника. Нижче наведено SqlDataSource для підключення до бази даних SQL Server:

<asp: SqlDataSource ProviderName = "System.Data.SqlClient" ... />

Наступний крок передбачає застосування необхідної рядка з'єднання – без нього встановлення з'єднання неможливе. Хоча можна жорстко закодувати рядок з'єднання в дескрипторі SqlDataSource, завжди краще поміщати його у розділ <connectionStrings> файлу web.config, щоб забезпечити більшу гнучкість і гарантувати, що рядок підключення не зміниться по необережності, що знизить ефективність пулу з'єднань.

Наприклад, якщо створити рядок з'єднання:

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">

<connectianStrings>

<Add name = "Northwind"

connectionString = "Data Source = localhost; Initial Catalog = Northwind;

Integrated Security = SSPI "/>

</ConnectionStrings>

</Configuration>

то потрібно буде специфікувати його в SqlDataSource, використовуючи приблизно такий $-вираз:

<asp:SqlDataSource ConnectionString = "<% $ ConnectionStrings: Northwind%>" ... />

Після того, як встановлені ім'я постачальника і рядок підключення, наступний крок полягає в додаванні логіки запиту, яку SqlDataSource використовує, коли підключиться до бази даних.

Отримання записів. Можна використовувати кожен елемент керування SqlDataSource для виконання одного запиту. Можна також додати відповідні команди для видалення, вставки та оновлення рядків. Наприклад, одного SqlDataSource достатньо для запиту і оновлення таблиці Customers в базі даних Northwind. Однак якщо потрібно незалежно отримувати або оновлювати інформацію Customers та Orders, то знадобляться два елементи керування SqlDataSource.

Логіка команд SqlDataSource застосовується через чотири властивості: SelectCommand, InsertCommand, UpdateCommand та DeleteCommand; всі вони приймають рядок. Рядок може бути вбудованим SQL (у цьому випадку відповідна властивість SelectCommandType, InsertCommandType, UpdateCommandType або DeleteCommandType повинно бути Text за промовчанням) або ім'ям збереженої процедури (у цьому випадку типом команди є StoredProcedure). Слід визначити команди тільки для тих типів дій, які необхідно виконувати. Іншими словами, якщо використовується джерело даних тільки для читання набору записів, то потрібно визначити лише одну властивість SelectCommand.

При конфігуруванні команди у вікні властивостей можна побачите властивість SelectQuery замість SelectCommand. SelectQuery насправді – це віртуальна властивість, що відображається для зручності під час проектування. При редагуванні SelectQuery (клацнувши на три крапки поруч з ім'ям властивості) можна використовувати спеціальний конструктор для написання тексту команди (SelectCommand) і додавати параметри команди (SelectParameters).

Нижче показаний повний SqlDataSource, який визначає команду SELECT для отримання записів з таблиці Employees:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 

    ConnectionString="<%$ ConnectionStrings:LabDBConnectionString %>" 

    SelectCommand="SELECT [Student_ID], [St_Name], [St_group], [St_rating] FROM [Student]">

</asp:SqlDataSource>

Можна написати логіку джерела даних вручну або ж скористатися візуальним конструктором, який дозволить створити з'єднання, а потім логіку команди в графічному створювачі запитів. Щоб викликати цей інструмент, виберіть елемент керування джерело даних, а потім пункт Configure Data Source з інтелектуального дескриптора.

Створивши джерело даних, можна "знімати сливки", а саме отримати можливість прив'язувати елементи керування під час проектування замість того, щоб писати логіку в обробнику події Page.Load. Ось як це працює:

1. Виберіть елемент керування джерелом даних і клацніть на пункті Refresh Schema в інтелектуальному дескрипторі. Цей крок ініціює його підключення до БД і вилучення інформації про стовпці для запиту користувача. Перевага полягає в тому, що ця інформація про стовпці тепер стає доступною у зручних випадаючих списках у відповідній частині вікна властивостей (якщо не використовувати цей крок або БД не доступна під час проектування, доведеться вводити імена стовпців вручну).

2. Додайте на форму ListBox, встановіть властивість ListBox.DataSourceID на елемент керування джерело даних. Можна вибрати його у випадаючому списку, який показує ще джерела даних форми.

3. Встановіть ListBox.DataTextField на стовпець, який необхідно відобразити (у даному випадку виберіть St_Name). Список полів повинен також бути представлений у випадаючому списку.

Рис. 9.6. Прив'язка спискового елемента керування до поля джерела даних

4. Можна використати ті ж кроки для прив'язки розширеного елемента керування даними. Додайте на сторінку GridView і встановіть необхідну інформацію про стовпці, оскільки GridView може відображати безліч стовпців. У поданні Design одразу відобразяться заголовки стовпців запиту.

5. Запустіть сторінку. Не турбуйтеся про виконання команд і виклику DataBind() на сторінці, ASP.NET виконає обидва ці завдання автоматично. У браузері відобразиться прив'язана до даних сторінка, показана на рис. 9.7. Ясно, що величезна перевага цих елементів керування джерелами даних полягає у тому, що вони дозволяють конфігурувати прив'язку даних під час проектування, без написання рутинного коду. Більше того, результат запиту з'являється (в обмеженій мірі) в конструкторі Visual Studio, тому можна скласти уявлення про те, як буде виглядати форма.

Рис. 9.7. Проста прив'язана до даних сторінка без коду

Аналіз прив'язки даних. Як вже обговорювалося раніше, можна прив'язуватися до DataReader або до DataView. Тому варто запитати, який підхід використовує елемент управління SqlDataSource? Насправді вибір за програмістом: в залежності від того, чи встановлено DataSourceMode в SqlDataSourceMode.DataSet (за промовчанням) або ж в SqlDataSourceMode.DataReader. Режим DataSet майже завжди краще, тому що він підтримує розширене сортування, фільтрацію та налаштування кешування, що залежать від DataSet. Всі ці засоби недоступні у режимі DataReader. Однак можна використовувати DataReader з виключно великими екранними таблицями, тому що він більш ефективно використовує пам'ять. Справа в тому, що DataReader тримає одночасно в пам'яті тільки один запис – рівно стільки, скільки необхідно, щоб скопіювати інформацію з запису в прив'язаний елемент керування. Обидва режими підтримують прив'язку до множини елементів керування. Щоб зрозуміти, чому таке можливо, варто уважно вивчити, як виконується отримання даних.

Якщо профіліювати БД, то виявиться, що прив'язка двох елементів керування до одного й того ж джерела даних змушує запит виконуватися двічі. З іншого боку, якщо прив'язати сторінку вручну, то можна прив'язати один і той же об'єкт до двох різних елементів керування, що означає необхідність лише в одноразовому виконанні запиту. Ясно, що SqlDataSource вимагає деяких накладних витрат, але якщо знати про них, то можна і проектувати відповідним чином. По-перше, слід розглянути кешування, яке SqlDataSource підтримує автоматично. По-друге, слід враховувати, що більшу частину часу не буде виконуватися прив'язка більше одного елемента керування до джерела даних. Це тому що розширені елементи керування даних – GridView, DetailsView і FormsView – мають можливість гнучко представляти безліч частин даних. Якщо використовувати ці елементи керування, то доведеться прив'язати тільки один з них, легко підкоряючись цьому обмеженню.

Крім того, важливо відзначити, що така прив'язка даних виконується в кінці обробки Web-сторінки, безпосередньо перед її відображенням. Це означає, що буде порушено подія Page.Load, за якою підуть будь-які події елементів керування, за якими послідує подія Page.PreRender і тільки потім відбудеться власне прив'язка даних. Прив'язка даних здійснюється при кожному зворотному відсиланні (якщо тільки не перенаправити на іншу сторінку). Якщо необхідно написати код, який вступає в дію після завершення прив'язки даних, можна перевизначити метод Page.OnPreRenderComplete(). Цей метод викликається негайно після стадії PreRender, але перед серіалізацією стану виду і відображенням дійсного HTML.

Параметризація даних. У попередньому прикладі весь запит був жорстко закодований. Часто замість цього необхідно отримувати підмножину даних, таку як всі продукти певної категорії або всі співробітники з певного міста.

У наступному прикладі створюється форма типу "головна-підлегла" із застосуванням параметрів. Для цього прикладу знадобиться два джерела даних. Перший є списком міст (де живуть співробітники). Ось визначення SqlDataSource:

<asp: SqlDataSource ID = "sourceEmployeeCities" runat = "server"

ProviderName = "System.Data.SqlClient"

ConnectionString = "<% $ ConnectionStrings: Northwind%>"

SelectCommand = "SELECT DISTINCT City FROM Employees">

</ Asp: SqIDataSouree>

Це джерело даних наповнює випадаючий список назвами міст:

<Asp: DropDownList ID = "lstCities" runat = "server"

DataSourceID = "sourceEmployeeCities"

DataTextField = "Clty" AutoPostBack = "True">

</ Asp: DropDownList>

Списковий елемент керування має включену автоматичну зворотну відправку, що гарантує, що сторінка буде відправлятися назад кожен раз, коли змінюється вибрана позиція у списку, надаючи можливість сторінці відповідно оновити свої прив'язані до даних елементи керування. Інший варіант полягає у створенні виділеної кнопки (такої як Select) поряд зі списковим елементом керування для ініціалізації зворотного відсилання.

При виборі міста друге джерело даних витягує всіх співробітників з цього міста. Нижче показано визначення другого джерела даних:

Трюк полягає в тому, що запит містить у собі параметр. Параметри завжди відзначаються символом @, як у даному випадку - @City. Можна визначити стільки символів, скільки необхідно, але відобразити кожного постачальника на окреме значення. У даному прикладі значення параметра @City вибирається з властивості lstCities.SelectedValue. Однак можна легко модифікувати дескриптор ControlParameter, прив'язавши його до іншої властивості або елементу керування.

Тепер, при запуску сторінку можна побачити список співробітників із зазначеного міста:

Рис. 9.8. Отримання записів на основі керованого вибору

Важливо зрозуміти переваги та обмеження цього прикладу. По-перше, при створенні параметризованої команди в дескрипторі SqlDataSource параметри правильно кодуються, що запобігає атакам втручанням. По-друге, всі прив'язані до даних елементи керування, що створюються таким чином, повторно прив'язують себе після кожної зворотного відсилання. Це, можливо, доставляє БД додаткову роботу, яка не вимагається, якщо припустити, що список міст змінюється не часто. Знов-таки, це саме той випадок, коли треба застосувати кешування.

Збережені процедури. Ви можете легко адаптувати цей приклад для використання збережених процедур. Наприклад, якщо у вас в базі даних є наступна збережена процедура:

то ви можете змінити джерело даних sourceEmployees:

Це не тільки надасть всі переваги збережених процедур, але також спростить частину .aspx сторінки за рахунок виключення дійсного SQL-запиту, який на реальних сторінках може виявитися досить довгим.

Ще про параметрезовані команди. Параметризовані значення не обов'язково надходять від інших елементів керування. Можна відобразити параметр на будь-який з типів параметрів, визначених у табл. 9.2.

Не обов'язково пам'ятати різноманітні імена дескрипторів, тому що Visual Studio пропонує зручний редактор, що дозволяє створювати команди і визначати параметри (рис. 9.9). Щоб побачити це діалогове вікно, клацніть на три крапки (...) поруч з властивістю SelectQuery у вікні властивостей. При введенні команди, яка використовує один або більше параметрів, клацніть на кнопці Refresh Parameters і з'явиться список параметрів. Потім можна вибрати відображення кожного параметра у вікні списку Parameter Source 

Таблиця 9.2. Типи параметрів

Джерело

Керуючий дескриптор

Опис

Властивість елемента керування

<asp:ControlParameter>

Властивість іншого елемента керування на сторінці.

Рядкове значення запиту

<asp:QueryStringParameter>

Значення з поточного рядка запиту.

Значення стану сеансу 

<asp:SessionParameter>

Значення, збережене в поточному сеансі користувача.

Значення cookie-набору

<asp:CookieParameter>

Значення з будь-якого cookie-набору, приєднаного до поточного запиту.

Значення профілю 

<asp:ProfileParameter>

Значення з поточного профілю користувача.

Змінна форми

<asp:FormParameter>

Значення, відправлене сторінці від елемента керування введенням. Зазвичай замість цього використовується властивість елемента керування, але може знадобитися витягти значення прямо з колекції Forms, якщо у відповідного елемента керування відключена підтримка стану виду.

Рис. 9.9. Конфігурування прив'язки параметрів під час проектування

Наприклад, можна розбити попередній приклад на дві сторінки. На першій визначити списковий елемент керування, який відобразить всі міста:

<Asp: SqlDataSource ID = "sourceEmployeeCities" runat = "server"

ProviderName = "System.Data.SqlCiient"

ConnectionString = "<% $ ConnectionStrings: Northwind%>"

SelectCommand = "SELECT DISTINCT City FROM Employees">

</Asp: SqlDataSource>

<Asp: ListBox ID = "lstCities" runat = "server"

DataSourceID = "sourceEmployeeCities"

DataTextField = "City"> </ asp: ListBox> <br />

Тепер знадобиться невеликий додатковий код для копіювання вибраного міста у рядок запиту і перенаправлення сторінці. Ось кнопка, яка зробить це:

protected void cmdGo_Click (object sender, EventArgs e)

{

Response.Redirect ("QueryParameter2.aspx? City =" + lstCities.SelectedValue);

}

І, нарешті, друга сторінка може прив'язати GridView у відповідності зі значенням city, переданого у рядку запиту:

<Asp: SqlDataSource ID = "sourceEmployees" runat = "server"

ProviderMame = "System.Data.SqlClient"

ConnectionString = "<% $ ConnectionStrings: Northwind%>"

SelectCommand = "GetEmployeesByCity" SelectCommandType = "StoredProcedure">

<SelectParameters>

<asp:QueryStringParameter Name="City" QueryStringField="city" />

</ SelectParameters>

</ Asp: SqlDataSource>

Обробка помилок. При роботі з зовнішнім ресурсом таким, як БД, необхідно захистити свій код деяким базовим об'ємом логіки, що оброблює помилки. Навіть якщо уникнути всіх можливих помилок при кодуванні, все одно слід захиститися від факторів, що не залежать від програміста, наприклад, якщо не запущений сервер БД або перервано мережне з'єднання.

Можна розраховувати на SqlDataSource в тому, що стосується правильного звільнення всіх ресурсів (подібних сполук) у разі виникнення помилки. Однак виключення, що лежить в основі, не може бути оброблено. Замість цього воно з'явиться на сторінці і порушить обробку. Як це буває і з будь-яким іншим необробленим виключенням, користувач отримає досить незрозуміле повідомлення на сторінці помилок. Це неминуче: якби SqlDataSource не повідомляв про виключення, то таким чином приховував би потенційні проблеми, що надзвичайно ускладнило б налагодження. Тим не менш, краще обробити проблему на Web-сторінці і відобразити більш інформативне повідомлення про помилку.

Щоб зробити це, необхідно обробити подію джерела даних, яка відбувається негайно після помилки. При виконанні запит це буде подія Selected. Якщо ж виконується операція оновлення, видалення або вставки, слід обробити події Updated, Deleted або Inserted відповідно. (Якщо не надавати повідомлення про помилки, що настроюються, то можна обробити всі ці події одним обробником.)

У обробнику помилок можна отримати доступ до об'єкта виключення через властивість SqlDataSourceStatusEventArgs.Exception. Якщо необхідно запобігти подальшому поширенню помилки, просто встановіть значення властивості SqlDataSourceStatusEventArgs.ExceptionHandled в true. Потім переконайтеся, що показали відповідне повідомлення про помилку на Web-сторінці, щоб проінформувати користувача про те, що команда не була завершена.

Нижче представлений приклад:

protected void sourceEmployees_Selected (object sender,

SqlDataSourceStatusEventArgs e)

{

if (e.Exception! = null)

{

//Замаскувати помилку узагальненим повідомленням (в цілях безпеки)

lblError.Text = "При виконанні запиту стався виняток";

//Вказати, що помилка оброблена.

e.ExceptionHandled = true;

}

}

Оновлення записів. Отримання даних – це лише півсправи. SqlDataSource також може проводити зміни. Єдина пастка тут в тому, що не всі елементи керування підтримують оновлення. Так, наприклад, простий ListBox не надає ніякої можливості користувачеві редагувати значення, видаляти існуючі елементи або вставляти нові. Розширені елементи керування ASP.NET, включаючи GridView, DetailsView та FormView, мають засоби редагування, які можна включити.

Перший крок полягає у визначенні підходящих команд для операцій, які необхідно виконати: таких як вставка InsertQuery, видалення DeleteQuery та оновлення UpdateQuery. Якщо відомо, що потрібно дозволити користувачеві виконувати тільки певні операції (наприклад, оновлення), а інші – ні (наприклад, вставку та видалення), то можна спокійно пропустити команди, які не вимагаються.

Команди InsertCommand, DeleteCommand та UpdateCommand визначаються таким же чином, як і команди для властивості SelectCommand, тобто використовуючи параметризовані запити. Наприклад, ось як виглядає SqlDataSource, який визначає базову команду поновлення кожного стовпця:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 

    ConnectionString="<%$ ConnectionStrings:LabDBConnectionString %>" 

    SelectCommand="SELECT [Student_ID], [St_Name], [St_group], [St_rating]

FROM [Student]" 

    UpdateCommand="UPDATE Student SET St_Name = @St_Name, St_group = @St_group,

St_rating = @St_rating WHERE (Student_ID = @Student_ID)">

    <UpdateParameters>

      <asp:Parameter Name="St_Name" />

      <asp:Parameter Name="St_group" />

      <asp:Parameter Name="St_rating" />

      <asp:Parameter Name="Student_ID" />

      </UpdateParameters>

</asp:SqlDataSource>

У цьому прикладі імена параметрів вибрані не випадково. Якщо давати кожному параметру ім'я, що збігається з ім'ям стовпця, до якого він відноситься, і розташовувати спереду символ @, то немає необхідності явно визначати ці параметри. Справа в тому, що елементи керування даними ASP.NET автоматично відправляють колекції параметрів з новими значеннями перед ініціацією поновлення.

Кожен параметр у колекції використовує цю угоду іменування. Щоб протестувати це, створіть сторінку з SqlDataSource, показаним раніше, і прив'язаним елементом керування GridView. Після цього зробіть наступні кроки для вирішення редагування:

1. Виберіть GridView. В інтелектуальному дескрипторі виберіть Add New Column.

2. У списку Choose a Field Type виберіть CommandField, відзначте прапорці Edit/Update та Show Cancel Button. Переконайтеся, що всі інші прапорці не відзначені.

3. Клацніть на кнопці ОК, щоб додати стовпець з редагованими елементами управління.

Після виконання цих кроків редаговані елементи керування GridView з'являться в додатковому стовпці. При запуску сторінки після прив'язки та відображення GridView у стовпці редагування поруч із кожним записом буде знаходитися посилання Edit. Після клацання на цьому посиланню воно переведе відповідний рядок у режим редагування. Усі стовпці рядка перетворяться в текстові поля (за винятком стовпців, доступних тільки для читання), а посилання Edit буде замінена посиланням Update та Cancel, як показано на рис.

Рис. 9.10. Редагування у GridView

Посилання Cancel повертає рядок в його початковий стан. Посилання Update передає значення колекції SqlDataSource.UpdateParameters (використовуючи імена полів) і потім викликає метод SqlDataSource.Update() для внесення змін у БД. Знов-таки, додатковий код писати не потрібно.

Так само створюються параметризрвані команди для DeleteCommand та InsertCommand. Для видалення і вставки необхідно додати до GridView стовпець, в якому властивості ShowInsertButton та ShowDeleteButton встановлені рівними true.

Отже Gridview – надзвичайно гнучкий елемент керування. Шаблони – одна з багатьох його властивостей – дозволяють визначати елементи керування і розмітку, які використовуються для редагування записів. Це зручно, якщо необхідно дозволити редагування через випадаючі списки, додати елементи перевірки достовірності або просто тонко налаштувати зовнішній вигляд рядка в режимі редагування.

Оновлення та ключові поля. Всі розширені елементи керування включають властивість DataKeyNames. Ця властивість вказує, яке поле (або поля) трактуються як первинні ключі.

Щоб використовувати цю властивість, необхідно встановити значення властивості DataKeyNames рівним списку з одного або більше ключових полів, розділених комами. Часто є всього одне ключове слово, як показано нижче:

<Asp: GridView ID = "gridEmployees" runat = "server"

DataSourceID = "sourceEmployees"

DataKeyNames = "EmployeeID" ... >

Ключові поля трактуються спеціальним чином. Наприклад, GridView забезпечує можливість простого отримання ключової інформації про заданий рядок. До того ж, при підтвердженні оновлення рядка елемент керування даними передає вихідне значення цих ключових полів поряд із зміненими значеннями (якщо тільки вони не оголошені доступними тільки для читання). Початкове значення використовується в конструкції WHERE для знаходження рядка, який слід оновити. Щоб уникнути плутанини, параметр, що містить початкове значення, автоматично отримує префікс original_. Наприклад, параметр @EmployeeID стає @original_EmployeeID.

Різниця може призвести до потенційної проблеми. Ви можете почати, використовуючи таке ім'я параметра, як @EmployeeID, а потім встановлювати властивість DataKeyNames для отримання доступу до іншого засобу зразок витягу. Коли ви спробуєте виконати оновлення, то отримаєте помилку, яке вказує на те, що параметр @EmployeeID не може бути знайдений. Що робить проблему ще більш заплутаною - так те, що можна виконати деякі дії у Visual Studio, такі як оновлення схеми для елемента керування даними, які автоматично встановлюють властивість DataKeyNames, не попереджаючи про це.

Тепер, коли ви розібралися в проблемі, рішення буде досить простим. Велику частину часу ви будете використовувати властивість DataKeyNames, тому повинні модифікувати команду, щоб використовувати оригінальне значення будь-якого первинного ключа, доступного тільки на читання. Ось приклад:

UpdateCommand = "UPDATE Employees SET FirstName = @ FirstName,

LastName = @ LastName, Title = @ Title, City = @ City

FROM Employees WHERE EmployeeID = @ original_EmployeeID ">

Ця проблема має й інше рішення. Угоду про іменуванні @original_ конфігуруються. Можна використовувати інший префікс, змінивши властивість SqlDataSource.OldValuesParameterFormatString. Це властивість приймає рядок у форматі @original_{0}, де {0} вказує початкове ім'я. Якщо відомо, що ключові значення доступні тільки для читання і не будуть модифікуватися в операції оновлення, то не треба використовувати цю угоду, оскільки немає різниці між вихідним ім'ям і поточним. Тому просто встановіть властивість SqlDataSource.OldValuesParameterFormatString в значення {0} і команди продовжать працювати з немодифікованими іменами полів.

Недоліки SqlDataSource. Як бачите, використовуючи SqlDataSource, часто можна уникнути необхідності написання коду доступу до даних. Однак при цьому доводиться жертвувати гнучкістю. Ось найбільш суттєві недоліки:

Логіка доступу до даних, вбудовується у сторінку. Щоб створити елемент керування SqlDataSource, доводиться жорстко кодувати SQL-пропозиції на Web-сторінці. Це означає, що не вийде тонко налаштувати запит без модифікацій Web-сторінки. У застосуванні масштабу підприємства це обмеження неприйнятне, тому що часто доводиться переглядати запити вже після розгортання застосування у відповідь на профілювання, додавання індексів і зміни очікуваного навантаження.

Порада. Можна трохи покращити цю ситуацію, обмежуючи використання SqlDataSource тільки з збереженими процедурами. Однак у масштабному Web-застосуванні код доступу до даних буде супроводжуватися, тестуватися і вдосконалюватися окремо від бізнес-логіки (він навіть може кодуватися іншими розробниками). SqlDataSource просто не надає такого ступеня гнучкості.

Супровід великих застосувань. Кожна сторінка, яка звертається до БД, потребує власного набору елементів керування SqlDataSource. Це може перетворити задачу підтримки в справжній кошмар, особливо якщо у існує кілька сторінок, що використовують один і той же запит (і кожна з них вимагає дублюючого примірника SqlDataSource). У заснованому на компонентах застосуванні слід використовувати більш високорівневу модель. Web-сторінки будуть взаємодіяти з бібліотекою доступу до даних, яка буде містити всі деталі, що стосуються БД.

Недолік гнучкості. Кожна задача доступу до даних вимагає окремого SqlDataSource. Якщо необхідно надати користувачеві кілька способів перегляду запитаних даних, то це може просто втопити сторінку в об'єктах доступу до даних – по одному для кожного варіанту команди. Це швидко приведе її до ускладнення.

Незастосовність для інших завдань. SqlDataSource не може правильно представити деякі типи завдань. SqlDataSource призначений для сценаріїв відображення і редагування даних. Однак цей метод не працює, якщо потрібно підключатися до БД і виконувати іншу задачу – таку як розміщення запиту на поставку в каналі замовлень або протоколювання подій. У таких ситуаціях доведеться розробляти власний код звернення до БД. Застосування єдиної бібліотеки доступу до бази, інкапсулює такі завдання разом з операціями вилучення і оновлення даних, спростить програму.

Фактично, в добре абстрагованому триланковому застосуванні Web-сторінка може викликати метод, такий як Business.PlaceOrder(), не піклуючись про те, чи включає ця опарація збереження запису про замовлення в БД, відправку повідомлення в чергу повідомлень, взаємодію з віддаленим компонентом або комбінацію всіх цих завдань.

Щоб обійти всі ці обмеження, можна розглянути можливість застосування ObjectDataSource. ObjectDataSource дозволяє прив'язати сторінку до призначеного для користувача компоненту доступу до даних. Найкраще те, що це надає майже всі ті ж зручності начебто прив'язки даних під час проектування і позбавляє від необхідності писати код на Web-сторінці.

Удосконалені елементи керування даними

ASP.NET 2.0 все ще надає шаблонні елементи керування, які були введені в ASP.NET 1.0. До них відносяться DataGrid, DataList і Repeater. Більшість програмістів ASP.NET більш не використовують їх, окрім як для зворотної сумісності (вони не обговорюються в цій книзі):

DataGrid – цілком замінений GridView, який представляє той же набір засобів (і багато поверх того) і спрощує режим кодування. За промовчанням DataGrid не представлений в панелі інструментів Visual Studio 2005.

DataList – здебільшого замінений GridView, який надає такий же набір шаблонів і набагато простішу модель кодування. Однак DataList все ще використовується, якщо необхідно створити таблицю з безліччю стовпців, в якій кожна комірка представляє окремий запис. GridView не підтримує такий незвичайний дизайн, оскільки вимагає, щоб запис займав окремий рядок.

Repeater – все ще відіграє певну роль як скелет шаблонного елемента керування. Хоча він не надає багатьох витончених засобів, все ж можна використовувати його для створення відображень даних, що настроюються. Repeater не додає ніяких вбудованих елементів, тому не обмежений табличним форматом. Однак, щоб отримати потрібний результат, доведеться витратити чимало зусиль, тому що Repeater не включає в себе високорівневих засобів, таких як вибір і редагування.

Нові елементи керування даними ASP.NET 2.0: GridView, DetailsView та FormView.

GridView. Команда розробників ASP.NET, перед якою було поставлено завдання удосконалити DataGrid, зберігаючи зворотну сумісність, вирішила створити абсолютно новий елемент керування для реалізації необхідних удосконалень. І цим елементом став GridView.

GridView – виключно гнучкий табличний елемент керування, призначений для демонстрації даних. Він включає в себе широкий діапазон вбудованих засобів, включаючи виділення, розбиття на сторінки і редагування. До того ж він може бути налаштований з застосуванням шаблонів. Величезною перевагою GridView перед DataGrid є його підтримка сценаріїв з вільним кодом. Використовуючи GridView, можна без написання коду вирішувати безліч поширених завдань, таких як переміщення по сторінках і виділення. У DataGrid для реалізації тих же засобів потрібно було використовувати обробку подій.

Примітка. DataGrid все ще доступний в ASP.NET 2.0. і тепер він підтримує прив'язку до елементів керування джерелами даних. Хоча він відсутній на панелі інструментів, але його можна додати, клацнувши правою кнопкою миші на цій панелі і вибравши в контекстному меню команду Choose Items. Пам'ятайте, що DataGrid повинен використовуватися тільки для зворотної сумісності на існуючих Web-сайтах ASP.NET (де він все ще працює досить добре). При створенні нових Web-сайтів слід застосовувати замість нього GridView.

Визначення стовпців. Приклади з GridView, які розглядалися раніше, встановлювали властивість GridView.AutoGenerateColumns рівним true. Коли встановлено цю властивість GridView використовує рефлексію для дослідження об'єкта даних і знаходження полів (для запису) або властивостей (для користувацького об'єкта). Потім він створює стовпці для кожного з них в тому порядку, в якому їх виявляє.

Ця автоматична генерація стовпців підходить для швидкого створення тестових сторінок, але не дає необхідної гнучкості, яка зазвичай потрібна. Наприклад, а якщо необхідно приховати стовпці, змінити їх порядок, або налаштувати деякі аспекти їх відображення, такі як форматування і тексти заголовків? У всіх подібних випадках знадобиться встановити AutoGenerateColumns рівним false і визначати стовпці самостійно в розділі <Columns> дескриптора елемента керування GridView.

Можна мати AutoGenerateColumns, встановлений в true, і визначати стовпці в розділі <Colunms>. У цьому випадку явно певні стовпці додаються перед згенерованими автоматично. Ця техніка використовувалася в попередньому розділі для створення GridView з автоматично згенеруваними стовпцями та вручну визначеними стовпцями з елементами керування редагуванням. Однак для максимальної гнучкості зазвичай слід явно визначати всі стовпці.

Кожен стовпець може відноситися до одного з декількох різних типів, описаних в табл. 10.1. Порядок дескрипторів стовпців задає порядок стовпців в GridView зліва направо.

Таблиця 10.1. Типи стовпців

Стовпець

Опис

BoundField

Відображає текст поля джерела даних.

ButtonField

Відображає кнопку для кожного значення в списку.

CheckBoxField

Відображає прапорець для кожного елемента списку. Використовується автоматично для полів, що зберігають значення true/false (в SQL Server це поля, що використовують тип даних bit).

CommandField

Надає вибір кнопок редагування.

HyperLinkField

Відображає свій вміст (поле з джерела даних або статичний текст) як гіперпосилання. 

ImageField

Відображає графічні дані з двійкового поля (припускаючи, що вони можуть бути успішно інтерпретовані як підтримуваний графічний формат).

TemplateField

Дозволяє специфікувати множинні поля, елементи керування, що налаштовуються, і довільний HTML, використовуючи шаблон. Надає найбільший ступінь керованості, але також вимагає максимуму роботи.

Найбільш базовий тип стовпця – BoundField, який прив'язує до одного поля в об'єкті даних. Наприклад, ось визначення стовпця з одиночної прив'язкою, отображающей поле EmployeeID:

<asp:BoundField DataField="EmployeeID" HeaderText="ID" />

Це надає одне вдосконалення у порівнянні зі стовпцем, згенерованих автоматично, а саме – текст заголовка, який в даному випадку змінений з EmployeeID на ID.

Коли ви створюєте GridView, властивість AutoGenerateColumns спочатку встановлено рівною true. Якщо прив'язати його до елемента керування джерелом даних, воно міняється на false, і Visual Studio додає дескриптор <BoundField> до кожного поля, яке знаходить у джерелі даних. Цей підхід має ряд переваг:

• можна легко налаштувати порядок стовпців, їх заголовки та інші деталі, змінюючи властивості об'єкта стовпця;

• можна приховувати стовпці, які не слід відображати, видаляючи їх дескриптори (проте не зловживайте цією технікою, оскільки деколи краще зменшити обсяг отриманих даних, просто виключивши стовпці, які треба відображати).

Стовпець також можна приховати програмно. Щоб це зробити, скористайтеся колекцією GridView.Columns. Наприклад, установка GridView1.Columns[2].Visible в значення false приховує третій стовпець. Приховані стовпці знаходяться взагалі поза відображуваного HTML.

Явно визначені стовпці працюють швидше, ніж згенеровані автоматично. Це пояснюється тим, що автоматично генеровані стовпці змушують GridView виконувати рефлексію джерела даних під час виконання.

Можна додавати додаткові стовпці для отримання, редагування тощо.

Якщо модифікувати джерело даних так, щоб воно повертало інший набір стовпців, то можна регенерувати стовпці GridView. Просто виберіть GridView і клацніть на посиланні Refresh Schema в інтелектуальному дескрипторі. Цей крок знищить всі користувацькі стовпці, які були додані (такі як стовпці для редагування).

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 

  DataSourceID="SqlDataSource1">

  <Columns>

    <asp:BoundField DataField="Student_ID" HeaderText="Код студента" />

    <asp:BoundField DataField="St_Name" HeaderText="Прізвище студента" />

    <asp:BoundField DataField="St_group" HeaderText="Група" />

    <asp:BoundField DataField="St_rating" HeaderText="Середній бал" />

    <asp:CommandField ShowEditButton="True" />

  </Columns>

</asp:GridView>

При явному оголошенні прив'язаного поля є шанс встановити й інші властивості. У табл. 10.2 перераховані ці властивості.

Щоб уникнути конфігурування стовпців вручну, виберіть GridView і клацніть на три крапки (...) поруч з властивістю Columns у вікні властивостей. Відкриється діалогове вікно Fields, яке дозволяє додавати, видаляти і налаштовувати стовпці (див. рис.).

Таблиця 10.2. Властивості BoundField

Свойство

Описание

DataField

Имя поля (для строки) или свойства (для объекта) элемента данных, который вы хотите отобразить в данном столбце.

DataFormatString

Форматная строка для форматирования поля. Удобно для задания правильного представления чисел и дат.

ApplyFormatInEditMode

Если равно true, то форматная строка будет использована для форматирования значения, даже если она появляется в текстовом поле в режиме редактирования. По умолчанию — false, что означает применение лежащего в основе нормального формата 1143.02 вместо $1,142.02).

FooterText,
HeaderText и
HeaderImageUrl

Устанавливают текст заголовка и нижнего колонтитула сетки, если сетка имеет заголовок (ShowHeader установлено в true) и нижний колонтитул (ShowFooter установлен в true). Заголовок чаще всего используется для указания описательного имени, такого как имя поля, в то время, как нижний колонтитул может содержать динамически вычисляемое значение вроде суммы по столбцу (техника продемонстрирована в разделе "Итоговые значения в GridView" ближе к концу настоящей главы). Чтобы показать графический образ в заголовке вместо текста, необходимо установить свойство HeaderImageUrl.

ReadOnly

Если равно true, то значение столбца не может быть изменено в режиме редактирования. Никакого редактирующего элемента управления не будет представлено. Часто столбцы первичных ключей описываются как ReadOnly.

InsertVisible

Если равно false, то значение этого столбца не может быть установлено в режиме вставки. Если вы хотите, чтобы значение столбца устанавливалось программно или было основано на значении по умолчанию, определенном в базе данных, то можете использовать это средство.

Visible

Если равно false, столбец не будет видимым на странице (и никакой HTML-код для него не генерируется). Это свойство предоставляет удобный способ программного сокрытия и показа определенных столбцов, изменения общего представления данных.

SortExpression

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

HtmlEncode

Если true (по умолчанию), то весь текст будет HTML, закодированный для предотвращения повреждения страницы специальными символами. Вы можете отключить кодирование HTML, если хотите встроить работающий дескриптор HTML (такой как гиперссылка), но этот подход небезопасен. Всегда лучше будет использовать кодирование HTML для всех значений и предоставление другой функциональности посредством реагирования на события выделения GridView.

NullDisplayText

Текст, который будет отображен для null-значения. По умолчанию — пустая строка, хотя вы можете изменить это на жестко закодированное значение, такое как (not specified).

ConvertEmptyStringToNull

Если равно true, то перед подтверждением редактирования все пустые строки будут преобразованы в null-значения.

ControlStyle, HeaderStyle, FooterStyle и
ItemStyle

Конфигурирует внешний вид только данного столбца, переопределяя стили строки. Больше о стилях будет рассказываться далее.

Форматування в GridView. Форматування складається з декількох взаємопов'язаних завдань. По-перше, потрібно гарантувати, що дати, валюти та інші числові значення будуть представлені відповідним чином. Ця робота виконується властивістю DataFormatString. Для застосовування різних кольорів, шрифтів, рамок та опцій вирівнювання до кожного аспекта екранної таблиці (grid) – від заголовка до елементів даних – GridView підтримує стилі. І, нарешті, можна перехоплювати події, переглядати дані рядків і програмно застосовувати форматування до певних елементів даних.

GridView також пропонує кілька властивостей форматування, призначення яких очевидно і тому вони тут не розкриваються. До них відносяться GridLines (для додавання та приховування рамок таблиці), CellPadding та CellSpacing (для управління загальними проміжками між комірками), а також Caption та CaptionAlign (для додання заголовка у верхній частині сітки).

Щоб створити прокручуваний всередині Web-сторінки GridView, помістіть його всередину елемента керування Panel, встановіть відповідний розмір панелі, а властивість Panel.Scrollbars – в Auto, Vertical або Both.

Форматування полів. Кожен стовпець BoundField надає властивість DataFormatString, яку можна використовувати для конфігурування зовнішнього вигляду чисел і дат, використовуючи форматний рядок.

Форматні рядки зазвичай складаються з заповнювача і індикатора формату, і все це укладено в фігурні дужки. Типовий форматний рядок виглядає приблизно так:

{0:C}

В даному випадку 0 – це значення, яке буде відформатовано, а буква – напередвизначений стиль формату. Тут С означає грошовий формат, який форматує число як суму в доларах (тому 3400.34 перетворюється в $3,400.34). Нижче показаний стовпець, який використовує форматний рядок:

<asp:BoundField DataField = "Price" HeaderText = "Price" DataFormatString = "{0:C}" />

<asp:BoundField DataField="BirthDate" HeaderText="Birth Date" 

DataFormatString="{0:MM/dd/yy}" />

У табл. 10.3 перераховані інші опції форматування числових значень.

Таблиця 10.3. Форматні рядки чисел

Тип

Форматний рядок

Приклад

Грошовий

{0:С}

$1,234.50

Дужки означають відємне значення:
($1,234.50).

Символ валюти залежить від локальних налаштувань: (?1,234.50)

Науковий (експоненційний)

{0:Е}

1.234.50Е+004

Процентний

{0:P}

45.6%

Фіксований десятковий

{0:F?}

Залежить від кількості десяткових розрядів після точки {0:F3} дасть 123.400, а {0:F0} – 123.

Для значень дати і часу також існує розширений список. Наприклад, якщо необхідно написати значення BirthDate у форматі місяць/день/рік (як 12/30/05), то використовується наступний стовпець:

<asp:BoundField DataField="BirthDate" HeaderText="Birth Date" 

DataFormatString="{0:MM/dd/yy}" />

Таблиця 10.4. Форматні рядки часу та дати

Тип

Форматная строка

Пример

Короткая дата

{0:d}

M/d/yyyy (например: 10/30/2005)

Длинная дата

{0:D}

dddd, MMMM dd, yyyy (например; Monday, January 30, 20О5)

Длинная дата и
короткое время

{0:f}

dddd, MMMM dd, yyyy HH:mm aa (например: Monday, January 30, 2005 10:00, AM)

Длинная дата и
длинное время

{0:F}

dddd, MMMM dd, yyyy HH:mm:ss aa (например: Monday, January 30, 2005 10:00:23 AM)

Сортируемый формат ISO

{0:s}

yyyy-MM-dd HH:mm:ss (например: 2005-01-30 10:00:23)

Месяц и день

{0:M}

MMMM dd (например: January 30)

Общий

{0:G}

M/d/yyyy HH:mm:ss aa (зависит от специфических локальных настроек) (например: 10/30/2002 10:00:23 AM)

Форматні символи не є специфічними тільки для GridView. Їх можна використовувати з іншими елементами керування, з виразами прив'язки даних в шаблонах і як параметри при виклику багатьох методів. Наприклад, типи Decimal та DateTime включають свої власні методи ToString(), які беруть форматний рядок, дозволяючи форматувати значення вручну.

Стилі. GridView надає широкий набір моделей форматування, заснованих на стилях. Всього можна встановити вісім стилів GridView, як перераховано в табл. 10.5.

Стилі – це не прості однозначні властивості. Кожен стиль надає об'єкт Style, що включає властивості для вибору кольорів (ForeColor та BackColor), додавання рамок (BorderColor, BorderStyle та BorderWidth), розмірів рядки (Height та Width), вирівнювання рядка (HorizontalAlign та VerticalAlign), a також конфігурування зовнішнього вигляду тексту (Font та Wrap). Ці властивості стилю дають можливість уточнити майже кожен аспект зовнішнього вигляду елемента. І якщо не треба жорстко кодувати всі налаштування зовнішнього вигляду Web-сторінки, то можна просто встановити властивість CssClass об'єкта стилю у посилання на клас таблиці стилів.

Таблиця 10.5. Стилі Gridview

Стиль

Описание

HeaderStyle

Конфигурирует внешний вид строки заголовка, содержащей заголовки столбцов, если включено их отображение (если ShowHeader установлено равным true).

RowStyle

Конфигурирует внешний вид каждой строки данных.

AlternatingRowStyle

Если установлен, применяет дополнительное форматирование к каждой второй строке. Это форматирование действует в дополнение к форматированию RowStyle. Например, если вы установите шрифт, используя RowStyle, он также применяется для дополнительных строк, если только явно не установлен другой шрифт через AlternatingRowStyle.

SelectedRowStyle

Конфигурирует внешний вид текущей выбранной строки. Это форматирование действует в дополнение к форматированию RowStyle.

EdltRowStyle

Конфигурирует внешний вид строки, находящейся в режиме редактирования. Это форматирование действует в дополнение к форматированию RowStyle.

EmptyDataRowStyle

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

FooterStyle

Конфигурирует внешний вид строки нижнего колонтитула в нижней части GridView, если включено их отображение (если ShowFooter установлено равным true).

PagerStyle

Конфигурирует внешний вид строки со ссылками на страницы, если включено постраничное разбиение (AllowPaging установлено равным true).

Визначення стилів. При установці властивостей стилю можна використовувати два схожих синтаксиса. По-перше, можна використовувати синтаксис вільного об'єкта (object-walker) для вказівки розширених властивостей стилю як атрибутів дескриптора:

<asp:GridView runat = "server" ID = "grid"

ItemStyle-ForeColor = "DarkBlue" ... />

</asp: GridView>

В якості альтернативи можна додати вкладені дескриптори, як показано тут:

<asp:GridView runat="server" ID="grid" ...>

<ItemStyle ForeColor = "DarkBlue" ... />

</asp:GridView>

Обидва підходи еквівалентні. Однак встановлюючи властивості стилю, слід прийняти ще одне рішення: можна специфікувати глобальні властивості стилю, які стосуються кожного стовпця в сітці (як в попередніх прикладах), або ж можна визначити стилі, специфічні для окремих стовпців. Щоб створити специфічний для стовпця стиль, необхідно додати атрибути стилю або вкладені дескриптори всередині відповідного дескриптора стовпця, як показано нижче:

<asp:GridView ID="GridView1" runat="server" ... >

   <Columns>

       <asp:BoundField DataField="Student_ID" HeaderText="Код студента" 

           ItemStyle-BackColor ="LightSteelBlue" />

   </Columns>

</asp:GridView>

Еквівалентно можна застосувати вкладені дескриптори:

<asp:GridView ID="GridView1" runat="server" ... >

   <Columns>

       <asp:BoundField DataField="Student_ID" HeaderText="Код студента" 

           SortExpression="Student_ID" >

           <ItemStyle Font-Bold="True" BorderWidth="1" />

       </asp:BoundField>

   </Columns>

</asp:GridView>

Ця техніка часто застосовується для визначення специфічної ширини стовпця. Якщо не визначати специфічну ширину стовпця, ASP.NET встановлює рівно таку ширину кожного стовпця, щоб в ньому помістилися необхідні дані (або, якщо перенесення рядків дозволено, то щоб умістити текст без розриву слів між рядками). Якщо значення відрізняються один від одного розмірами, ширина визначається за найбільшим значенням, або довжиною заголовка стовпця – дивлячись що виявиться більшим. Однак якщо сітка досить широка, можна розширити стовпець так, щоб він не був притиснутий до соcедніх стовпців. У цьому випадку буде потрібно явно задати більшу ширину.

Так виглядає повністю форматований дескриптор GridView:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 

   Font-Names = "Verdana" Font-Size = "X-Small" ForeColor = "#333333" 

   CellPadding = "4" GridLines = "None" DataSourceID="SqlDataSource1" >

   <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />

   <RowStyle BackColor="#FFFBD6" ForeColor="#333333" />

   <AlternatingRowStyle BackColor="White" />

   <Columns>

       <asp:BoundField DataField="Student_ID" HeaderText="Код студента" 

           SortExpression="Student_ID" >

           <ItemStyle Font-Bold="True" BorderWidth="1" />

       </asp:BoundField>

       <asp:BoundField DataField="St_Name" HeaderText="Прізвище студента" 

           SortExpression="St_Name" />

       <asp:BoundField DataField="St_group" HeaderText="Група" 

           SortExpression="St_group" >

           <ItemStyle BackColor="LightSteelBlue" />

       </asp:BoundField>

       <asp:BoundField DataField="St_rating" HeaderText="Середній бал" 

           SortExpression="St_rating" DataFormatString = "{0:F3}" >

           <ItemStyle Wrap="True" Width="200"/>

       </asp:BoundField>

       <asp:CommandField ShowEditButton="True" ItemStyle-BackColor ="LightSteelBlue"/>

   </Columns>

</asp:GridView>

У прикладі застосовуються властивості GridView для установки шрифту і вирівнювання відстані між стовпчиками і лініями сітки. Використовуються стилі для виділення напівжирним заголовків і настроюється фон основних і додаткових стовпців. Крім того, специфічні для стовпця налаштування стилю виділяють іншим кольором фону інформацію про місцезнаходження, виділяють напівжирним значення ідентифікаторів і явно встановлюють розмір стовпця St_rating застосовується для форматування всіх значень дійсних чисел в полі St_rating. На рис. 10.2 показаний кінцевий результат.

Рис. 10.2. Відформатований GridView

Налаштування стилів у Visual Studio. He обов'язково кодувати властивості стилю вручну в дескрипторі елемента керування GridView, оскільки цей елемент надає багату підтримку під час проектування. Щоб встановити властивості стилю, можна перейти у вікно властивостей і модифікувати в ньому ці властивості. Наприклад, щоб встановити шрифт заголовка, розгорніть властивість HeaderStyle, щоб відобразити вкладене властивість Font, і встановіть його. Єдине обмеження цього підходу полягає в тому, що він не дозволяє встановлювати стилі окремих стовпців. Для цього необхідно викликати діалогове вікно Fields (показане на мал. 10.1), редагуючи властивість Columns. Потім слід вибрати відповідний стовпець і належним чином встановити його властивості стилю.

Можна навіть встановити комбінацію стилів, використовуючи напередвизначену тему, клацнувши на посиланні Auto Format в інтелектуальному дескрипторі GridView. На рис. 10.3 показано діалогове вікно Auto Format з попередньо встановленими стилями, з яких можна вибирати. Вибрати Remove Formatting, щоб очистити всі налаштування стилю.

Рис. 10.3. Автоматично форматований GridView

Після того, як обрана тема, установки стилю поміщаються в дескриптор GridView, і ви можете правити їх вручну або через вікно властивостей.


 

А также другие работы, которые могут Вас заинтересовать

74564. Нелінійні оптимізаційні моделі економічних систем 910 KB
  Основні труднощі розв’язування задач нелінійного програмування. Раніше було розглянуто методи розв’язування задач лінійного програмування. Галузі об’єднання та окремі підприємства народного господарства функціонують і розвиваються за умов невизначеності а тому адекватно їх можна описати нелінійними стохастичними динамічними моделями. Зауважимо що сучасний рівень розвитку комп’ютерної техніки і методів математичного моделювання створює передумови для застосування нелінійних методів а це може суттєво підвищити якість розроблюваних планів...
74565. Квадратичне програмування 597.5 KB
  Метод розв’язування задач квадратичного програмування. Система має ненульовий розв’язок якщо. Метод розв’язування задач квадратичного програмування Зазначимо що відомим з теорії аналізу функцій є таке твердження: від’ємно означена квадратична форма є угнутою а додатно означена – опуклою...
74566. Научное знание в Древней Греции 60 KB
  Определение математики как универсального языка способствовало развитию принципов рационального типа мышления. Важнейшей вехой на пути создания математики как теоретической науки были работы пифагорейской школы. Греческие ученые развили прежде всего процедурную и операционную стороны математики выработав понятие доказательства утверждений. Связи между этими двумя областями возникающей математики были двухсторонними.
74567. Научное знание в эпоху Средневековья 43.63 KB
  Все это методологически подготовило формирование опытной науки. На ранних этапах средневековья центрами научнофилософской мысли были монастыри и храмы но с появлением университетов именно они стали центрами развития философии и науки. Их деятельность объективно способствовала развитию науки в экспериментальном направлении. В целом он обосновывал идею опытной науки.
74568. Развитие науки в период Нового времени 98.15 KB
  Предпосылки развитию науки формировались во всех сферах жизни общества. Обществу становилась все более ясной практическая польза науки как и взаимная заинтересованность научных исследований в новых общественных отношениях. Этот период можно с полным правом назвать веком науки и научной революции.
74569. Современный этап в развитии науки 38.56 KB
  Как известно XIX век – это период дисциплинарного оформления науки. Дифференциация научного знания приведшая к появлению новых научных дисциплин со своим предметом и специфическими средствами познания продолжала оставаться ведущей тенденцией развития науки того времени. Сформировались образ науки как дисциплинарно организованного знания и дисциплинарный подход ориентированный на изучение специфических частных закономерностей и явлений.
74570. Возникновение науки, основные стадии её исторической 36.5 KB
  Наука была всегда с момента зарождения человеческого общества т. Наука начинает отсчет с египетской цивилизации. Наука возникла в Древней Греции т. Наука возникла в Западной Европе в 1214 веках поскольку появился интерес к опытному знанию и математике.
74571. Научное знание Древнего Египта 41 KB
  Цивилизация Древнего Египта того времени располагала глубокими знаниями в области математики медицины географии химии астрономии и других областях. За тысячи лет до талантливых мужей Эллады жрецы Древнего Египта в совершенстве изучили и овладели секретами которые мы заново открываем в наш стремительный век.
74572. Горные породы 734 KB
  Горные породы различаются по цвету структуре текстуре минеральному составу и форме залегания. Текстура характеризует относительное расположение и распределение составных частой породы. Минералы образующие горные породы называются породообразующими.