//Nepotřebné USING //using System.Collections; //using System.Linq; //using System.Text; //using System.Windows.Data; //using System.Windows.Documents; //using System.Windows.Input; //using System.Windows.Navigation; //using System.Windows.Shapes; //using System.Windows.Media.Animation; using System; using System.Collections.Generic; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Data; using System.Data.SqlClient; ////prvky pro graf using System.Windows.Controls.DataVisualization.Charting; ////pro export do Excelu using ExcelLibrary.SpreadSheet; ////prvky Ribbon using Microsoft.Windows.Controls.Ribbon; ////pro export do png using System.IO; namespace PM_view { /// /// Definuje třídu MainWindow, která je odvozená od Ribbon Window /// /// /// Tato třida definuje hlavní okno porgramu /// public partial class MainWindow : RibbonWindow { ////////////////////////////////////Deklarace proměnných///////////////////////////////////////////////// string zbytek = ""; //proměnná do které se ukládají data pro připojovaíc řetězec k SQL serveru public Dictionary data_paru = new Dictionary(); //slovník do kterého se kopírují páry z okna pro nastavení grafu public Dictionary data_paru2 = new Dictionary(); // slovník párů, které se předávají pro zobrazen grafu public List nazev_sl = new List(); // List názvů sloupců, které se používají v metodě pro zobrazení grafů napln_graf_win okno_graf; //deklarace okna grafů Prohlizec webProhlizec; //deklarace weobého prohlížeče QueryBuilder query; // deklarace okna query builderu Dotazy SQLdotaz = new Dotazy(); // deklarace třídy dotazů DataSet dSet = new DataSet(); // dekalrace datasetu, který z SQL dotazu naplněn //proměnné která hlídají, zda je okno grafů již něčím naplněné nebo ne int pocet_sloupcu2 = 0; int pocet_radku2 = 0; /// /// Konstruktor hlavního okna /// Při inicializaci definuje napoejní třídy Dotazů na prvek ComboBox pro výběr statických dotazů /// Inicializuje objekt okna pro zobrazení grafů - inicializován je zde z výkonostních důvodů /// public MainWindow() { InitializeComponent(); CB_dotazy.ItemsSource = SQLdotaz.naplnslovnik(); CB_dotazy.DisplayMemberPath = "Key"; CB_dotazy.SelectedValuePath = "Value"; okno_graf = new napln_graf_win(); } /// /// Metoda provádějící připojení k databázi, vracející naplněný dataset /// /// /// /// DataSet Pripojeni(string retezec_pripojeni, string dotaz) //vyřešit aby metoda vracela string dotazu a otevře spojení { //před každým připojením se vyčistí InfoText InfoText.Clear(); string connString = @" network address =" + retezec_pripojeni; SqlConnection conn = new SqlConnection(connString); DataSet dataSET = new DataSet(); try { conn.Open(); InfoText.Text += "Připojení otevřeno: "; InfoText.Text += "\n"; SqlDataAdapter SqlAdapter = new SqlDataAdapter(dotaz, conn); SqlAdapter.Fill(dataSET); } catch (Exception err) { //InfoText.Text += "Chyba připojení: "; //InfoText.Text += "\n"; InfoText.Text += err.ToString(); //InfoText.Text += "\n"; create_XLS.IsEnabled = false; create_XML.IsEnabled = false; nacti_graf.IsEnabled = false; Menu_ClearTab.IsEnabled = false; } finally { conn.Close(); InfoText.Text += dotaz; InfoText.Text += "\n"; InfoText.Text += "Připojení uzavřeno"; } return dataSET; } /// /// MEtoda, která vrácený dataset z připoejení vizualizuje v tabulce /// Ellipse fill znamená zobrazní červeného / zeleného kolečka signalizující zda je dataSet naplněn nějakými daty /// /// private void vizualizujData(DataSet data) { try { if (data.Tables.Count > 0) { ellipse1.Fill = System.Windows.Media.Brushes.Green; } else { ellipse1.Fill = System.Windows.Media.Brushes.Red; } //nastavení zdorjů pro zobrazní datasetu v tabulce this.DataContext = dSet.Tables[0].DefaultView; int pocet_sloupcu = dSet.Tables[0].Columns.Count; int pocet_radku = dSet.Tables[0].Rows.Count; /// povolení dalších tlačítek v menu create_XLS.IsEnabled = true; create_XML.IsEnabled = true; nacti_graf.IsEnabled = true; Menu_ClearTab.IsEnabled = true; } catch(Exception err) { InfoText.Text += "Chyba zobrazení dat: "; InfoText.Text += "\n"; InfoText.Text += err; InfoText.Text += "\n"; create_XLS.IsEnabled = false; create_XML.IsEnabled = false; nacti_graf.IsEnabled = false; Menu_ClearTab.IsEnabled = false; } } /// /// Událost, která provede dotaz na databázi, při změně ComboBoxu /// Provede dotaz, jehož Alias je vbrán /// /// /// private void CB_dotazy_SelectionChanged(object sender, SelectionChangedEventArgs e) { //pokud měním dotaz, a je nějaký graf načetn musím ho nejdřív smazat smaz_graf_Click(sender, e); //nastaví proěmnné aby se při znovuotevření grafu při jednom dotazu nenačitaly znova a znova prvkou sloupců a řádků pocet_radku2 = 0; pocet_sloupcu2 = 0; //pro každý změněný dotaz se vytvoří nový objekt okna grafu. okno_graf = new napln_graf_win(); //vyčistí tabulku, to je tu hlavně pro opakovaný dotaz dSet.Clear(); //vymaže ten InfoBox InfoText.Clear(); //SQL dotaz string sql_dotaz = CB_dotazy.SelectedValue.ToString(); //připojovaí řetězec, proměnná zbytek je řetězec, který dává detily připojení z okna DB_conn_win string connString = @" network address =" + zbytek; //Připojí se k databázi a na základě dotazu vrátí výsledek naplněný dataset dSet = Pripojeni(zbytek, sql_dotaz); //Přečte a naplní Tabulku daty vizualizujData(dSet); } /// /// Metoda, která vymaže obsah tabulky /// Nastaví semafor na červenou /// Zakáže sama sebe, načtení grafu a exporty do XLS a XML /// pokud je zobrazen graf vymaže ho /// /// /// private void Menu_ClearTab_Click(object sender, RoutedEventArgs e) { dSet.Reset(); dSet.Clear(); dSet.Tables.Clear(); if (dSet.Tables.Count == 0) //tohle by mohla byt samostatna metoda, ktera kontroluje obsha datasetu { ellipse1.Fill = System.Windows.Media.Brushes.Red; } Menu_ClearTab.IsEnabled = false; create_XLS.IsEnabled = false; create_XML.IsEnabled = false; nacti_graf.IsEnabled = false; } /// /// Událost, která při spuštění tlačítka zobrazí okno pro nastavení parametrů připojení /// Volá metodu spojení /// /// /// private void Connect_DB_win_Click(object sender, RoutedEventArgs e) { spojeniDB(); } /// /// Událost pro export tabulky do XML /// /// /// private void create_XML_Click(object sender, RoutedEventArgs e) { Microsoft.Win32.SaveFileDialog save_dlg = new Microsoft.Win32.SaveFileDialog(); save_dlg.Filter = "soubor formátu XML |*.xml"; save_dlg.FileName = "Tabulka_export"; var dialog = save_dlg.ShowDialog(); string XML_cesta = save_dlg.FileName; dSet.WriteXml(XML_cesta); } /// /// Událost pro export tabulky do Excelu /// Zde je přidána externí knihovna ExcelLibrary.dll /// /// /// /// private void create_XLS_Click(object sender, RoutedEventArgs e) { Microsoft.Win32.SaveFileDialog save_dlg = new Microsoft.Win32.SaveFileDialog(); save_dlg.Filter = "Textový soubor Excel 2003 - 2007 |*.xls"; save_dlg.FileName = "Tabulka_export"; var dialog = save_dlg.ShowDialog(); string cesta = save_dlg.FileName; CreateWorkbook2(cesta, dSet); } /// /// Metoda pro export do excelu - metoda která se nachází ve výše zmíěnné knihovně musela být opravena a explicitně napsána /// Důvodem bylo oštřerní případů pro DB NULL hodnoty /// /// /// public static void CreateWorkbook2(String filePath, DataSet dataset) { if (dataset.Tables.Count == 0) throw new ArgumentException("Data set musí obsahovat alespoň jednu tabulku", "dataset"); Workbook workbook = new Workbook(); foreach (DataTable dt in dataset.Tables) { Worksheet worksheet = new Worksheet(dt.TableName); for (int i = 0; i < dt.Columns.Count; i++) { // Přidá hlavičku sloupců worksheet.Cells[0, i] = new Cell(dt.Columns[i].ColumnName); // Naplní řádky for (int j = 0; j < dt.Rows.Count; j++) //ošetření případnu hodnoty která je DB NULL worksheet.Cells[j + 1, i] = new Cell(dt.Rows[j][i] == DBNull.Value ? "" : dt.Rows[j][i]); } workbook.Worksheets.Add(worksheet); // přidá list tabulky } workbook.Save(filePath); //uoží tabulku } /// /// Metoda, které zobrazí okono pro připojení, z okna přebere argumenty a nastaví proměnné připojení (cestu hestlo, username) /// Je možnost 3 parametrů - připojení na FSV serverv GEO1 /// Lokální server /// Libovolný jiný server /// private void spojeniDB() { DB_conn_win2 okno = new DB_conn_win2(); okno.Title = "Připojení k serveru"; if (okno.ShowDialog().Value) { if (okno.server_text_string.Text.Equals("Geo1_server")) { zbytek = "tcp:geo1.fsv.cvut.cz\\MSSQLSERVERR2,1433 ;user id =" + okno.name_of_user.Text + ";password =" + okno.password_of_user.Password + ";Initial Catalog=COST_mesta"; } else if (okno.local_radio.IsChecked == true) { zbytek = okno.server_text_string.Text; } else if (okno.other_remote_radio.IsChecked == true) { zbytek = okno.server_text_string.Text + ";user id =" + okno.name_of_user.Text + ";password =" + okno.password_of_user.Password; } //Povolení na dotazovací funkce CB_dotazy.IsEnabled = true; QueryBuild_DB_win.IsEnabled = true; } } /// /// Zobrazuje graf /// Přebírá hodnoty z okna grafů /// /// private void zobraz_data(napln_graf_win okno_graf) { //vyčistí data párů data_paru2.Clear(); mcChart.Series.Clear(); //inicializace pomocné hodnoty double hodnota = -1; int j = 0; //pomocna proměnná pro číslo sloupce foreach (string line in data_paru.Keys) { int index = data_paru[line]; if (dSet.Tables[0].Rows[index][nazev_sl[j]] == DBNull.Value) //pokud je hodnota DB NULL zobrazí se hodnota 0 { hodnota = (int)0; } else { hodnota = Double.Parse((dSet.Tables[0].Rows[index][nazev_sl[j]]).ToString()); } j++; data_paru2.Add(line, hodnota); } // nastaví podel předané hodnoty z okna grafů, jaký typ grafu se bude zobrazovat switch (okno_graf.t) { // histogram case 1: { ColumnSeries bar = new ColumnSeries(); bar.IndependentValuePath = "Key"; bar.DependentValuePath = "Value"; bar.ItemsSource = data_paru2; mcChart.Series.Add(bar); break; } // sloupce naležato case 2: { BarSeries bar = new BarSeries(); bar.IndependentValuePath = "Key"; bar.DependentValuePath = "Value"; bar.ItemsSource = data_paru2; mcChart.Series.Add(bar); break; } // Koláčový case 3: { PieSeries bar = new PieSeries(); bar.IndependentValuePath = "Key"; bar.DependentValuePath = "Value"; bar.ItemsSource = data_paru2; mcChart.Series.Add(bar); break; } // Bodový case 4: { ScatterSeries bar = new ScatterSeries(); bar.IndependentValuePath = "Key"; bar.DependentValuePath = "Value"; bar.ItemsSource = data_paru2; mcChart.Series.Add(bar); break; } // liniový case 5: { LineSeries bar = new LineSeries(); bar.IndependentValuePath = "Key"; bar.DependentValuePath = "Value"; bar.ItemsSource = data_paru2; mcChart.Series.Add(bar); break; } // liniový s výplní case 6: { AreaSeries bar = new AreaSeries(); bar.IndependentValuePath = "Key"; bar.DependentValuePath = "Value"; bar.ItemsSource = data_paru2; mcChart.Series.Add(bar); break; } } } /// /// Událost, která zobrazí okno grafu /// je zde variant, že pokud není v grafu nic načteno, porjde celá procedura včetně načtení dat z data setu /// V případě že již nějaká data načtena jsou, je předpokald že okno je jen schováno - tudíž je přeskočeno načítání obsahu a okno se jen zobrazí /// /// /// /// private void nacti_graf_Click(object sender, RoutedEventArgs e) { if (pocet_radku2 == 0 && pocet_sloupcu2 == 0) { pocet_sloupcu2 = dSet.Tables[0].Columns.Count; pocet_radku2 = dSet.Tables[0].Rows.Count; for (int i = 1; i < pocet_sloupcu2; i++) //jednička je tam, abychom se vyhnuli problémům, kdyby někdo ve sloupci hodnot vybral obec { okno_graf.list_hodnota.Items.Add(dSet.Tables[0].Columns[i].ToString()); } //zbavíme se sloupce ID pokud ho hodnota obsahuje if (okno_graf.list_hodnota.Items.Contains("ID")) { okno_graf.list_hodnota.Items.RemoveAt(okno_graf.list_hodnota.Items.IndexOf("ID")); } for (int j = 0; j < pocet_radku2; j++) { okno_graf.list_promenna.Items.Add(dSet.Tables[0].Rows[j][0]); } //překopíruje slovník z okna grafů skrz vlastnost data_paru = okno_graf.d; //prekopiruje názevl sloupců z okna grafů skrz vlastnost nazev_sl = okno_graf.s; } ///Volám funkci, která bude volat zobrazení do grafu okno_graf.ShowDialog(); zobraz_data(okno_graf); } /// /// Událost, která otevře Dialog pro otevření souborů, načetný XML soubor se načte do stasetu a zobrazí v tabulce /// Dále se s daty může pracovat jako v případě výseldku z SQL dotazu /// Je to zde z důvodu, pokud uživtel chce pracovat s již jendou generovanými daty /// pro zobrazení grafu nastaví proměnné, aby se graf nově otevřel /// /// /// private void load_XML_Click(object sender, RoutedEventArgs e) { pocet_sloupcu2 = 0; pocet_radku2 = 0; //pokud měním dotaz, a je nějaký graf načetn musím ho nejdřív smazat smaz_graf_Click(sender, e); //pro každý změněný dotaz se vytvoří nový objekt okna grafu. okno_graf = new napln_graf_win(); dSet.EnforceConstraints = false; //vyčistí dataset Menu_ClearTab_Click(sender,e); //otevře dialog s filtrem na XML Microsoft.Win32.OpenFileDialog open_dlg = new Microsoft.Win32.OpenFileDialog(); open_dlg.Filter = "XML dokuemnt |*.xml"; Nullable result = open_dlg.ShowDialog(); //pokud OK nastaví dataSet daty z XML if (result == true) { string XML_cesta = open_dlg.FileName; try { dSet.ReadXml(XML_cesta); } //pokud není XML ve vhodném stavu, je zachycena vyjímka, která uvede data Setdo zákaldího stavu catch { dSet.Reset(); MessageBox.Show("V datasetu nejsou relevatní data"); } } else { MessageBox.Show("Není vybrán žádný XML soubor"); } //pokud jsou v XML nějaká data if (dSet.Tables.Count > 0) { ellipse1.Fill = System.Windows.Media.Brushes.Green; vizualizujData(dSet); } } /// /// Událost, která smaže vytovřený graf /// /// /// private void smaz_graf_Click(object sender, RoutedEventArgs e) { mcChart.Series.Clear(); } /// /// Po zaškrtnutí zobrazí tabulku /// /// /// private void check_tab_Checked(object sender, RoutedEventArgs e) { tabView3.Visibility = Visibility.Visible; } /// /// Po odkšrtnutí se tabulka schová /// /// /// private void check_tab_Unchecked(object sender, RoutedEventArgs e) { tabView3.Visibility = Visibility.Collapsed; } /// /// Po zaškrtnutí zobrazí graf /// /// /// private void check_graf_Checked(object sender, RoutedEventArgs e) { mcChart.Visibility = Visibility.Visible; tabView3.MaxWidth = groupZobraz.ActualWidth / 2; // aby to bylo videt } /// /// Po odkšrtnutí se graf schová /// /// /// private void check_graf_Unchecked(object sender, RoutedEventArgs e) { mcChart.Visibility = Visibility.Collapsed; tabView3.MaxWidth = groupZobraz.ActualWidth; // aby to bylo videt } /// /// Pokud je nějaký graf aktivní, je po stitku exportován do png /// Pokud je graf prázndný uživatel je na to upozorněn /// /// /// private void export_graf_Click(object sender, RoutedEventArgs e) { bool tabulka_nucenene_zavrena = false; //exportovat graf je možné jen při zavřené tabulce string obr_cesta = null; if (okno_graf.list_par.Items.Count < 1 || mcChart.Series.Count < 1) { MessageBox.Show("Není co exportovat z grafu"); } else { if (tabView3.IsVisible == true) { tabView3.Visibility = Visibility.Collapsed; check_tab.IsChecked = false; tabulka_nucenene_zavrena = true; } // kód pro uložení obrázku Microsoft.Win32.SaveFileDialog uloz_obr = new Microsoft.Win32.SaveFileDialog(); uloz_obr.Filter = "Obrázek |*.png"; uloz_obr.FileName = "Graf"; Nullable result = uloz_obr.ShowDialog(); if (result == true) { obr_cesta = uloz_obr.FileName; //cesta k souboru graf_export((int)mcChart.ActualWidth, (int)mcChart.ActualHeight, obr_cesta); } if (tabulka_nucenene_zavrena == true && tabView3.IsVisible == false) { tabView3.Visibility = Visibility.Visible; check_tab.IsChecked = true; tabulka_nucenene_zavrena = false; } } } /// /// Metoda pro vlastní exprot obrázku do png /// Vstupuje zde rozmery obrázku a cesta k nemu /// /// /// /// private void graf_export(int sirka, int vyska, string obr_cesta) { RenderTargetBitmap renderBitmap = new RenderTargetBitmap(sirka, vyska, 96d, 96d, PixelFormats.Pbgra32); renderBitmap.Render(mcChart); FileStream outStream = new FileStream(obr_cesta, FileMode.Create); PngBitmapEncoder encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(renderBitmap)); encoder.Save(outStream); outStream.Close(); } /// /// Po zakšrtnutí je objeví okno s webovou prohlížečkou nastavenou na projekt Kadlecová Kratocvhíl /// /// /// private void check_web_Checked(object sender, RoutedEventArgs e) { Uri uri = new Uri("http://geo1.fsv.cvut.cz/pin2/2012/g/", UriKind.RelativeOrAbsolute); webProhlizec = new Prohlizec(); webProhlizec.webBrowser.Navigate(uri); webProhlizec.Closing += delegate { uncheck(); }; webProhlizec.Show(); } /// /// metoda, která je přidána do prohlížeče jako delegát, která říká že po odškrtnutí se zavře /// private void uncheck() { check_web.IsChecked = false; webProhlizec.Closing -= delegate{uncheck() ;}; } /// /// Událost otevře okno Query Builderu /// /// /// private void QueryBuild_DB_win_Click(object sender, RoutedEventArgs e) { //před změnou dotazu musím smazat graf a tabulka smaz_graf_Click(sender, e); Menu_ClearTab_Click(sender,e); query = new QueryBuilder(); //nsataví proěmnné pro zobrazení grafu pocet_radku2 = 0; pocet_sloupcu2 = 0; // vytovří objekt okna grafů okno_graf = new napln_graf_win(); //naplní dotazem SQL TreeView peo výber prvků pro SQL dostaz DataSet pokusX = new DataSet(); string sql_dotaz2 = @"Select Distinct t.name AS tabulka_name, s.name AS sloupec_name FROM COST_mesta.sys.tables t INNER JOIN COST_mesta.sys.all_columns s on t.object_id = s.object_id Where t.name != 'sysdiagrams'"; pokusX = Pripojeni(zbytek, sql_dotaz2); DataRow[] tabfiltr = pokusX.Tables[0].Select("tabulka_name IS NOT NULL"); //vyčístí tabulku od dupplicitních záznamů DataView view = new DataView(pokusX.Tables[0]); DataTable distinctValues = view.ToTable(true, "tabulka_name"); // vlastní naplnění // Nejprve se zjistí název tabulky (první foreach) a pro každou tabulku se vypíšou její sloupce (vnořený foreach) foreach (DataRow rad_tab in distinctValues.Rows) { string rok = "'" + (string)rad_tab[0] + "'"; TreeViewItem node = new TreeViewItem(); node.FontStyle = FontStyles.Oblique; node.FontSize = 14; node.Header = rok; query.treeView1.Items.Add(node); DataRow[] filtrovane = pokusX.Tables[0].Select("tabulka_name = " + rok.ToString()); foreach (DataRow radek in filtrovane) { string sloupec = (string)radek[1]; TreeViewItem item = new TreeViewItem(); item.Header = sloupec; item.FontStyle = FontStyles.Normal; item.FontSize = 12; node.Items.Add(item); //Odstranění sloupců (ID a obec), které jsou nevhodné pro explicitní výběr SQL dotazu if (sloupec == "ID" | sloupec == "obec" + (string)rad_tab[0]) { node.Items.Remove(item); } } } //zobrazí dialog query.ShowDialog(); //naplní dataset dSet = Pripojeni(zbytek, query.textVysledek.Text); //naplní Tabulku daty vizualizujData(dSet); } /// /// Událost, která hlídá, to aby při zapnutých grafech a tabulce, měly oba prvky maximálně polovinu celého prostoru /// Událsot má rozné eventuaility zakštrnutých checkboxů /// /// /// private void Hlavni_okno_SizeChanged(object sender, SizeChangedEventArgs e) { if (tabView3.IsVisible & mcChart.IsVisible) { tabView3.MaxWidth = groupZobraz.ActualWidth / 2; } else if (tabView3.IsVisible & !mcChart.IsVisible) { tabView3.MaxWidth = groupZobraz.ActualWidth; } else if (!tabView3.IsVisible & mcChart.IsVisible) { mcChart.MaxWidth = groupZobraz.ActualWidth; } InfoText.MaxWidth = zalozka_databaze.ActualWidth / 2; } /// /// Otevře okno a zobrazí inforamce o porgramu /// /// /// private void About_Click(object sender, RoutedEventArgs e) { about_win oProgramu = new about_win(); oProgramu.ShowDialog(); } /// /// Zobrazí okno nápovědy /// /// /// private void Help_Click(object sender, RoutedEventArgs e) { Prohlizec pomoc = new Prohlizec(); string curDir = Directory.GetCurrentDirectory(); Uri url = new Uri(String.Format("file:///{0}/help/pm_view.htm", curDir)); pomoc.webBrowser.Navigate(url); pomoc.Show(); } } }