using System;
using System.Text; // Wymagane przez StringBuilder.
using System.Data;
using System.Data.SqlClient; // Dla obiektu DataAdapter, itd.
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{
   protected void Page_Load(object sender, EventArgs e)
   {
      if (!IsPostBack)
      {
         UpdateDetailsGrid();

         DataSet ds = CreateDataSet();
         GridView1.DataSource = ds.Tables[0];
         GridView1.DataBind();

         // Tworzymy DataView i czymy z DetailsView.
         DataView detailsView = new DataView(ds.Tables[1]);
         DetailsGridView.DataSource = detailsView;
         Session["DetailsView"] = detailsView;
         DetailsGridView.DataBind();

         // czymy siatk zawierajc powizania ze zbiorem powiza.
         OrderRelationsGridView.DataSource = ds.Relations;
         OrderRelationsGridView.DataBind();

      }
   }

   // Pobieramy szczegy zamwienia.
   public void OnSelectedIndexChangedHandler(
      Object sender, EventArgs e)
   {
      UpdateDetailsGrid();
   }

   private void UpdateDetailsGrid()
   {

      int index = GridView1.SelectedIndex;
      if (index != -1)
      {
         // Z siatki danych pobieramy identyfikator zamwienia.
         DataKey key = GridView1.DataKeys[index];
         int orderID = (int)key.Value;
         DataView detailsView = (DataView)Session["detailsView"];
         detailsView.RowFilter = "OrderID = " + orderID;
         DetailsGridView.DataSource = detailsView;
         DetailsGridView.DataBind();
         OrderDetailsPanel.Visible = true;
      }
      else
      {
         OrderDetailsPanel.Visible = false;
      }
   }

   private DataSet CreateDataSet()
   {
      // Cig znakw poczenia w celu poczenia z baz danych zamwie.
      string connectionString =
      "Data Source=Mozart;Initial Catalog=Northwind;Integrated Security=True";

      // Tworzymy obiekt Connection, inicjalizujemy z
      // cigiem znakowym poczenia, a nastpnie otwieramy poczenie.
      System.Data.SqlClient.SqlConnection connection =
         new System.Data.SqlClient.SqlConnection(connectionString);

      connection.Open();

      // Tworzymy obiekt SqlCommand i przypisujemy mu poczenie.
      System.Data.SqlClient.SqlCommand command =
         new System.Data.SqlClient.SqlCommand();
      command.Connection = connection;

      StringBuilder s = new StringBuilder(
         "select OrderID, c.CompanyName, c.ContactName, ");
      s.Append(" c.ContactTitle, c.Phone, orderDate");
      s.Append(" from orders o ");
      s.Append("join customers c on c.CustomerID = o.CustomerID");

      // Ustalamy CommandText dla zapytania select.
      command.CommandText = s.ToString();

      // Tworzymy DataAdapter i przypisujemy mu obiekt Command,
      // a nastpnie dodajemy map tabeli dla bdw.
      SqlDataAdapter dataAdapter = new SqlDataAdapter();
      dataAdapter.SelectCommand = command;
      dataAdapter.TableMappings.Add("Table", "Orders");

      // Tworzenie zbioru danych i uycie DataAdapter do jego wypenienia.
      DataSet dataSet = new DataSet();
      dataAdapter.Fill(dataSet);

      // Utworzenie drugiego obiektu polecenia dla szczegw zamwienia.
      System.Data.SqlClient.SqlCommand command2 =
         new System.Data.SqlClient.SqlCommand();
      command2.Connection = connection;

      // Tym razem upewniamy si, e dodalimy kolumn ProductID, co umoliwi
      // nam utworzenie zwizku z tabel Products.
      StringBuilder s2 =
         new StringBuilder(
         "Select od.OrderID, OrderDate, p.ProductID, ");
      s2.Append(" ProductName, od.UnitPrice, Quantity ");
      s2.Append("from Orders o ");
      s2.Append("join [Order Details] od on o.orderid = od.orderid ");
      s2.Append("join products p on p.productID = od.productid ");

      command2.CommandText = s2.ToString();

      // Tworzymy drugi obiekt DataAdapter i dodajemy
      // polecenie oraz map tabeli, a nastpnie wypeniamy
      // zbir danych z tego drugiego obiektu DataAdapter.
      SqlDataAdapter dataAdapter2 = new SqlDataAdapter();
      dataAdapter2.SelectCommand = command2;
      dataAdapter2.TableMappings.Add("Table", "Order Details");
      dataAdapter2.Fill(dataSet);

      // Tworzymy trzeci obiekt polecenia dla tabeli Products.
      System.Data.SqlClient.SqlCommand command3 =
         new System.Data.SqlClient.SqlCommand();
      command3.Connection = connection;

      string strCommand3 = "Select ProductID, ProductName from Products";
      command3.CommandText = strCommand3;

      // Tworzymy trzeci obiekt DataAdapter
      // i dodajemy polecenie oraz map tabeli, a nastpnie
      // wypeniamy zbir danych z tego trzeciego obiektu DataAdapter.
      SqlDataAdapter dataAdapter3 = new SqlDataAdapter();
      dataAdapter3.SelectCommand = command3;
      dataAdapter3.TableMappings.Add("Table", "Products");
      dataAdapter3.Fill(dataSet);

      // Deklaracja obiektw DataRelation i DataColumn.
      System.Data.DataRelation dataRelation;
      System.Data.DataColumn dataColumn1;
      System.Data.DataColumn dataColumn2;

      // Ustawiamy dataColumns, aby utworzy zwizki midzy
      // tabelami Orders i Order Details za pomoc klucza OrderID.
      dataColumn1 =
         dataSet.Tables["Orders"].Columns["OrderID"];
      dataColumn2 =
         dataSet.Tables["Order Details"].Columns["OrderID"];

      dataRelation =
         new System.Data.DataRelation(
         "OrdersToDetails",
         dataColumn1,
         dataColumn2);

      // Dodajemy nowy obiekt DataRelation do zbioru danych.
      dataSet.Relations.Add(dataRelation);

      // Ponownie uywamy obiektw DataColumns i DataRelation
      // do utworzenia zwizku midzy tabelami Order Details i Products.
      dataColumn1 = dataSet.Tables["Products"].Columns["ProductID"];
      dataColumn2 = dataSet.Tables["Order Details"].Columns["ProductID"];

      dataRelation =
         new System.Data.DataRelation(
         "ProductIDToName",
         dataColumn1,
         dataColumn2);

      // Dodajemy zwizek HistoryToSeverity do zbioru danych.
      dataSet.Relations.Add(dataRelation);

      return dataSet;
   } // Koniec metody createDataSet.
} // Koniec klasy.
