1 Technologia .Net Bazy danych część 2.
2 Obiekt DataSet W odróżnieniu od przedstawionych wcześniej obiektów nie musi mieć związku z zewnętrznym źródłem danych Jest pamięciowym relacyjnym zasobnikiem danych Może przechowywać dane w postaci XML
3 Tworzenie obiektu DataSetDataSet Studia = new DataSet(); DataTable Studenci = new DataTable(); Studia.Tables.Add(Studenci); DataColumn Nowa = new DataColumn(); Nowa.ColumnName = "IdStudenta"; Nowa.DataType = Type.GetType("System.Int32"); Nowa.Unique = true; Nowa.AutoIncrement = true; Studenci.Columns.Add(Nowa);
4 Nowa = new DataColumn();Nowa.ColumnName = "Nazwisko"; Nowa.DataType = Type.GetType("System.String"); Studenci.Columns.Add(Nowa); Studenci.Columns.Add("Imie", Type.GetType("System.String")); DataRow wiersz; wiersz = Studenci.NewRow(); wiersz["Nazwisko"] = "Macioł"; wiersz["Imie"] = "Andrzej"; Studenci.Rows.Add(wiersz); Student.Text = Studenci.Rows[0]["Nazwisko"].ToString();
5 Tworzenie obiektu DataSet
6 Użycie obiektu DataGridView
7 Połączenie obiektów DataRow wiersz; wiersz = Studenci.NewRow();wiersz["Nazwisko"] = "Macioł"; wiersz["Imie"] = "Andrzej"; Studenci.Rows.Add(wiersz); wiersz["Nazwisko"] = "Baster"; wiersz["Imie"] = "Barbara"; SiatkaDanych1.DataSource = Studenci;
8 Efekt
9 Wykorzystanie obiektu DataSetprivate void Lista_Click(object sender, EventArgs e) { for (int i = 0; i < Studenci.Rows.Count; i++) DataRow row = Studenci.Rows[i]; Student.Text += row["Nazwisko"].ToString() + "\r" + "\n"; }
10 Wykorzystanie obiektu DataSet
11 Wyszukiwanie wg kluczaprivate void Znajdz_Click(object sender, EventArgs e) { DataColumn[] pk = new DataColumn[1]; pk[0] = Studenci.Columns[0]; Studenci.PrimaryKey = pk; label1.Visible=true; idStudenta.Visible=true; OK.Visible=true; }
12 private void OK_Click(object sender, EventArgs e){ Object Indeks = idStudenta.Text; DataRow ZnalezionyWiersz; ZnalezionyWiersz = Studenci.Rows.Find(Indeks); if (ZnalezionyWiersz == null) MessageBox.Show("Nie ma studenta z kodem równym " + Indeks.ToString()); } else Student.Text = ZnalezionyWiersz["Imie"].ToString() + ZnalezionyWiersz["Nazwisko"].ToString();
13 Wyszukiwanie
14 Wynik
15 Klucz wielokrotny private void NazwiskoImie_Click(object sender, EventArgs e) { DataColumn[] pk = new DataColumn[2]; pk[0]= Studenci.Columns["Nazwisko"]; pk[1] = Studenci.Columns["Imie"]; Studenci.PrimaryKey = pk; label2.Visible = true; label3.Visible = true; Nazwisko.Visible = true; Imie.Visible = true; Szukaj.Visible = true; }
16 private void Szukaj_Click(object sender, EventArgs e){ Object[] Indeks = new Object[2]; Indeks[0] = Nazwisko.Text; Indeks[1] = Imie.Text; DataRow ZnalezionyWiersz; ZnalezionyWiersz = Studenci.Rows.Find(Indeks); if (ZnalezionyWiersz == null) MessageBox.Show("Nie ma studenta z nazwskiem równym " + Nazwisko.Text); } else Student.Text = ZnalezionyWiersz["Imie"].ToString() + ZnalezionyWiersz["Nazwisko"].ToString();
17 Wynik
18 Wynik
19 Filtrowanie danych
20 DataRow[] ZnalezionyWiersz;private void Filtruj_Click(object sender, EventArgs e) { string wyrazenie = "Imie ='" + Imie.Text +"'"; ZnalezionyWiersz = Studenci.Select(wyrazenie); if (ZnalezionyWiersz.Count() == 0) MessageBox.Show("Nie ma studenta z imieniem równym " + Imie.Text); } else for (int i = 0; i < ZnalezionyWiersz.Count(); i++) DataRow row = ZnalezionyWiersz[i]; Student.Text += row["Nazwisko"].ToString() + "\r" + "\n";
21 Filtrowanie danych
22 Wynik
23 Sortowanie private void Sortowanie_Click(object sender, EventArgs e) {ZnalezionyWiersz = Studenci.Select("", "Nazwisko ASC"); for (int i = 0; i < ZnalezionyWiersz.Count(); i++) DataRow row = ZnalezionyWiersz[i]; Student.Text += row["Nazwisko"].ToString() + "\r" + "\n"; }
24 Wynik
25 Obiekt DataView private void View_Click(object sender, EventArgs e) {DataView widok = new DataView(ds.Tables["Studenci"], "Nazwisko > 'B'", "Nazwisko", DataViewRowState.OriginalRows); foreach (DataRowView _w in widok) Student.Text += _w["Nazwisko"].ToString() + "\r" + "\n"; }
26 Wynik
27 Tworzenie relacji private void button1_Click(object sender, EventArgs e) { DataColumn rodzic = Studenci.Columns[0]; DataColumn dziecko = Oceny.Columns[0]; DataRelation Relacja = new DataRelation( "StudenciZaliczenia", rodzic, dziecko); ds.Relations.Add(Relacja); rodzic = Przedmioty.Columns["PrzedmiotId"]; dziecko = Oceny.Columns["PrzedmiotId"]; Relacja = new DataRelation("PrzedmiotyZaliczenia", rodzic, dziecko); }
28 private void button2_Click(object sender, EventArgs e){ DataRow rodzic; string Nazwisko, Imie, Przedmiot; foreach (DataRow wiersz in Oceny.Rows) rodzic=wiersz.GetParentRow("StudenciZaliczenia"); Nazwisko= rodzic["Nazwisko"].ToString(); Imie = rodzic["Imie"].ToString(); rodzic=wiersz.GetParentRow("PrzedmiotyZaliczenia"); Przedmiot = rodzic["Przedmiot"].ToString(); listBox1.Items.Add(Imie.Trim() + " " + Nazwisko.Trim() + ", " + Przedmiot.Trim() + ", " + wiersz["Data"] + ", " + wiersz["Ocena"].ToString()); }
29 Wynik
30 Wprowadzenie pól combodataGridView1.DataSource = Oceny; DataGridViewComboBoxColumn KolumnaCombo = new DataGridViewComboBoxColumn(); KolumnaCombo.DataSource = Studenci; KolumnaCombo.DisplayMember = "Nazwisko"; KolumnaCombo.ValueMember = "StudentId"; KolumnaCombo.HeaderText = "Student"; KolumnaCombo.DataPropertyName = "StudentId"; dataGridView1.Columns.Add(KolumnaCombo); dataGridView1.Columns[0].Visible = false;
31 Wprowadzenie pól comboDataGridViewComboBoxColumn KolumnaCombo1 = new DataGridViewComboBoxColumn(); KolumnaCombo1.DataSource = Przedmioty; KolumnaCombo1.DisplayMember = "Przedmiot"; KolumnaCombo1.ValueMember = "PrzedmiotId"; KolumnaCombo1.HeaderText = "Przedmiot"; KolumnaCombo1.DataPropertyName = "PrzedmiotId"; dataGridView1.Columns.Add(KolumnaCombo1); dataGridView1.Columns[1].Visible = false; dataGridView1.Columns[4].DisplayIndex = 0; dataGridView1.Columns[5].DisplayIndex = 1;
32 Wprowadzenie pól comboDim KolumnaCombo1 As New DataGridViewComboBoxColumn KolumnaCombo1.DataSource = Studia.Tables("Przedmioty") KolumnaCombo1.DisplayMember = "Przedmiot" KolumnaCombo1.ValueMember = "IdPrzedmiotu" KolumnaCombo1.HeaderText = "Przedmiot" KolumnaCombo1.DataPropertyName = "IdPrzedmiotu" DataGridView1.Columns.Add(KolumnaCombo1) DataGridView1.Columns(1).Visible = False DataGridView1.Columns(4).DisplayIndex = 0 DataGridView1.Columns(5).DisplayIndex = 1 End Sub
33 Wynik
34 Ograniczenia w DataSet
35 ds.Tables.Add("Ocena"); ds.Tables["Ocena"].Columns.Add("Ocena", Type.GetType("System.String")); DataRow wiersz; wiersz = ds.Tables["Ocena"].NewRow(); wiersz["Ocena"] = "2,0"; ds.Tables["Ocena"].Rows.Add(wiersz); wiersz["Ocena"] = "3,0"; ……. ForeignKeyConstraint OcenaZaliczenieFK = new ForeignKeyConstraint("OcenaZaliczenieFK", ds.Tables["Ocena"].Columns["Ocena"], ds.Tables["Oceny"].Columns["Ocena"]); OcenaZaliczenieFK.UpdateRule = Rule.Cascade; ds.Tables["Oceny"].Constraints.Add(OcenaZaliczenieFK); dataGridView2.DataSource = ds.Tables["Ocena"];
36
37
38 Obiekt DataAdapter Pośredniczy między obiektem DataSet a rzeczywistym źródłem danych Ma dwie metody: Fill i Update Oraz cztery właściwości: SelectCommand, InsertCommand, UpdateCommand i DeleteCommand Występuje w wersjach SQL, OleDb i Oledbc
39 Wypełnianie obiektu DataSet ze źródła danych
40 Źródło danych
41 Połączenie ze źródłem DataSet ds = new DataSet();DataTable Studenci = new DataTable(); private void Form1_Load(object sender, EventArgs e) { //Tworzenie połączenia (1) SqlConnection conn = new SqlConnection( "Server=Stacjonarny\\SqlExpress;Database=Test;" + "Integrated Security=True"); // Ciąg znaków połączenia (2) string query = "SELECT * from Studenci"; // Tworzenie adaptera danych (3) SqlDataAdapter da = new SqlDataAdapter(query, conn); // Tworzenie tabeli obiektu DataSet i zapełnienie jej danymi da.Fill(ds, "Studenci"); SiatkaDanych1.DataSource = ds.Tables["Studenci"]; Studenci = ds.Tables["Studenci"]; }
42 Wynik
43 Pobieranie wielu tabel w oparciu o wiele kwerend – drugie źródło
44 Nowy grid dla „Przedmiotów”
45 SqlConnection conn = new SqlConnection("Server=Stacjonarny\\SqlExpress;Database=Test;" + "Integrated Security=True"); string query = "SELECT * from Studenci"; SqlDataAdapter da = new SqlDataAdapter(query, conn); da.Fill(ds, "Studenci"); query = "SELECT * from Przedmioty"; SqlDataAdapter dap = new SqlDataAdapter(query, conn); dap.Fill(ds, "Przedmioty"); query = "SELECT * from Oceny"; SqlDataAdapter dao = new SqlDataAdapter(query, conn); dao.Fill(ds, "Oceny");
46 Private Sub Pobierz_Click(ByVal sender As SystemPrivate Sub Pobierz_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Pobierz.Click Dim Connection As New SqlConnection Dim Adapter As SqlDataAdapter Dim sql As String Connection.ConnectionString = _ "Data Source=STACJONARNY\SQLEXPRESS;Integrated Security=True;Initial Catalog=Test" Studia.Tables.Add(Studenci) Sql = "SELECT * FROM Studenci WHERE (CEILING(CAST(SUBSTRING(PESEL, LEN(PESEL), 1) AS float) / 2) - CAST(SUBSTRING(PESEL, LEN(PESEL), 1) AS float) / 2 = 0)" Adapter = New SqlDataAdapter(sql, Connection) If Connection.State = ConnectionState.Closed Then Connection.Open() Studia.Clear() Adapter.Fill(Studia, "Studenci") DataGridView1.DataSource = Studia.Tables("Studenci")
47 Studia.Tables.Add(Przedmioty)Adapter.SelectCommand.CommandText = "SELECT * FROM Przedmioty" Adapter.Fill(Studia, "Przedmioty") PrzedmiotyGrid.DataSource = Studia.Tables("Przedmioty") End Sub
48 Wynik
49 Uwaga Użycie jednego „adaptera” do wielu tabel uniemożliwia rozsądne ich aktualizowanie
50 Pobieranie danych przy użyciu procedury składowanejCREATE PROCEDURE [dbo].[WybieranieStudentow] AS SELECT StudentId, Nazwisko, Imie, PESEL, Kod FROM Studenci
51 Aktualizacja danych z dataset przy użyciu procedury składowanej - dopisywanieUSE [Test] GO /****** Object: StoredProcedure [dbo].[Dopisanie] Script Date: 12/03/ :36:57 ******/ SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON CREATE PROCEDURE char(10) AS INSERT INTO Prowadzacy (Nazwisko, Imie, Tytul) @Tytul)
52 Private Sub ZapiszP_Click(ByVal sender As SystemPrivate Sub ZapiszP_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ZapiszP.Click Dim SQLConn As New SqlConnection SQLConn.ConnectionString = _ "Data Source=STACJONARNY\sqlexpress;Initial Catalog=Test;Integrated Security=True" SQLConn.Open() Polecenie.Connection = SQLConn Polecenie.CommandType = CommandType.StoredProcedure Polecenie.CommandText = "DopisaniePracownikow" Polecenie.Parameters.Add(New SqlDbType.Char)) = ParameterDirection.Input Polecenie.Parameters.Add(New SqlDbType.Char)) = ParameterDirection.Input
53 Polecenie.Parameters.Add(New SqlParameter("@Tytul", SqlDbType.Char))= ParameterDirection.Input Dim Widok As New DataView(Me.TestDataSet2.Prowadzacy) Widok.RowStateFilter = DataViewRowState.Added Dim i, wynik As Integer For i = 0 To Widok.Count - 1 = Widok(i)("Nazwisko") = Widok(i)("Imie") = Widok(i)("Tytul") wynik = Polecenie.ExecuteNonQuery Next i End Sub
54 Aktualizacja danych z dataset przy użyciu procedury składowanej -dopisywanie
55 Wynik
56 Aktualizacja danych z dataset przy użyciu procedury składowanej -zmianaCREATE PROCEDURE bigint AS UPDATE Prowadzacy SET Nazwisko Imie WHERE ProwadzacyId
57 Polecenie. Parameters. Add(New SqlParameter("@ProwadzacyId", SqlDbTypePolecenie.Parameters.Add(New SqlDbType.Char)) = ParameterDirection.Input ……………. Polecenie.CommandText = "ZmianaPracownikow" Widok.RowStateFilter = DataViewRowState.ModifiedCurrent For i = 0 To Widok.Count - 1 = Widok(i)("Nazwisko") = Widok(i)("Imie") = Widok(i)("Tytul") = Widok(i)("ProwadzacyId") wynik = Polecenie.ExecuteNonQuery Next i
58 Stan wyjściowy
59 Zmiany
60 Wynik
61 Aktualizacja danych z dataset przy użyciu procedury składowanej –usuwanie rekordówCREATE PROCEDURE bigint AS DELETE FROM Prowadzacy WHERE ProwadzacyId
62 Polecenie.CommandText = "UsuwaniePracownikow"Widok.RowStateFilter = DataViewRowState.Deleted For i = 0 To Widok.Count - 1 Polecenie.Parameters.Clear() Polecenie.Parameters.Add(New SqlDbType.Char)) = ParameterDirection.Input = Widok(i)("ProwadzacyId") wynik = Polecenie.ExecuteNonQuery Next i
63 Usuwanie rekordu Zmieniony
64 Wynik
65 Aktualizacja danych przy użyciu CommandBuilderaImports System.data.SqlClient Public Class PzAdapterem Dim Polecenie As New SqlCommand Dim Adapter As SqlDataAdapter Dim Builder As SqlCommandBuilder Dim Prowadzacy As DataSet Dim SQLConn As New SqlConnection
66 Private Sub PzAdapterem_Load(ByVal sender As SystemPrivate Sub PzAdapterem_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load SQLConn.ConnectionString = _ "Data Source=STACJONARNY\sqlexpress;Initial Catalog=Test;Integrated Security=True" SQLConn.Open() Prowadzacy = New DataSet Adapter = New SqlDataAdapter("Select * from Prowadzacy", SQLConn) Builder = New SqlCommandBuilder(Adapter) Adapter.Fill(Prowadzacy, "a") DataGridView1.DataSource = Prowadzacy.Tables("a") End Sub Private Sub Zapisz_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Zapisz.Click Adapter.Update(Prowadzacy, "a") End Class
67 Aktualizacja danych przy użyciu CommandBuildera - stan wyjściowy
68 Poprawki
69 Wynik
70 Tworzenie źródła danych przy użyciu kreatora
71 Wybór połączenia
72 Wybór obiektów dla dataset
73
74 Powiązanie pola combo
75 Powiązanie pola combo
76 Imports System.Data.SqlClientPublic Class Zamowienia Private Sub Zamowienia_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'TODO: This line of code loads data into the 'TestDataSet5.Zamowienia' table. You can move, or remove it, as needed. Me.ZamowieniaTableAdapter.Fill(Me.TestDataSet5.Zamowienia) 'TODO: This line of code loads data into the 'TestDataSet5.Klienci' table. You can move, or remove it, as needed. Me.KlienciTableAdapter.Fill(Me.TestDataSet5.Klienci) Me.TestDataSet5.Zamowienia.Rows.Add() Me.BindingContext(Me.ZamowieniaBindingSource1).Position = Me.TestDataSet5.Zamowienia.Rows.Count - 1 End Sub
77 Private Sub Button1_Click(ByVal sender As SystemPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.BindingContext(Me.ZamowieniaBindingSource1).Position -= 1 Me.BindingContext(Me.ZamowieniaBindingSource1).Position += Me.ZamowieniaTableAdapter.Update(Me.TestDataSet5.Zamowienia) End Sub End Class
78 Wynik
79 Dodanie oryginalnego adaptera
80 Dodajemy Grid
81 Przygotowanie proceduryUSE [Test] GO SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON CREATE PROCEDURE [dbo].[InsertZamowienie] @IdKlienta char(255), @Data datetime, @Identity bigint out AS INSERT INTO Zamowienia (Data, = SCOPE_IDENTITY()
82 Private Sub Button1_Click(ByVal sender As SystemPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.BindingContext(Me.ZamowieniaBindingSource1).Position -= 1 Me.BindingContext(Me.ZamowieniaBindingSource1).Position += 1 Dim Adapter As New SqlDataAdapter Dim Conn As New SqlConnection Dim Builder As SqlCommandBuilder Conn.ConnectionString = "Data Source=STACJONARNY\sqlexpress;Initial Catalog=Test;Integrated Security=True" Adapter = New SqlDataAdapter("Select * from Zamowienia", Conn) Adapter.InsertCommand = New SqlCommand("InsertZamowienie", Conn) Adapter.InsertCommand.CommandType = CommandType.StoredProcedure Adapter.InsertCommand.Parameters.Add( _ SqlDbType.DateTime, 0, "Data") SqlDbType.BigInt, 0, "IdKlienta")
83 Dim parameter As SqlParameter = Adapter. InsertCommand. ParametersDim parameter As SqlParameter = Adapter.InsertCommand.Parameters.Add( _ SqlDbType.BigInt, 0, "IdZamowienia") parameter.Direction = ParameterDirection.Output Builder = New SqlCommandBuilder(Adapter) Adapter.Update(Me.TestDataSet5.Zamowienia) Dim x As Integer x = Adapter.InsertCommand.Parameters(2).Value Me.TestDataSet5.Specyfikacja.Columns("IdZamowienia").DefaultValue = x End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Me.SpecyfikacjaTableAdapter.Update(TestDataSet5.Specyfikacja) Me.Close()
84 Wprowadzanie danych
85 Wynik
86 C#
87 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace testh { public partial class Form1 : Form public Form1() InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) // TODO: This line of code loads data into the 'testDataSet.Studenci' table. You can move, or remove it, as needed. this.studenciTableAdapter.Fill(this.testDataSet.Studenci); private void button1_Click(object sender, EventArgs e) this.studenciTableAdapter.Update(this.testDataSet.Studenci);
88 Drukowanie - przygotowanie
89 Tworzenie i pokazywanie instancji formularza drukujPublic Class Form1 Private Sub DrukujToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DrukujToolStripMenuItem.Click Dim Druk As New Drukuj Druk.ShowDialog() End Sub End Class
90 Tworzenie nowego źródła danych
91 Po „zbudowaniu” aplikacji pojawią się jej komponenty
92
93
94
95
96
97
98 Ładowanie danych i wyświetlanie widoku raportuPublic Class Drukuj Private Sub Drukuj_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.StudenciTableAdapter1.Fill(TestDataSet.Studenci) Me.raport1.SetDataSource(TestDataSet) End Sub End Class
99 Eksportowanie raportu
100 Drukowanie z VB Do drukowania wykorzystuje się obiekty z przestrzeni nazw importowanej poleceniem: Imports System.Drawing.Printing Oraz obiekty Printing: PrintDialog, PrintPreviewDialog itd.
101 Przygotowanie do druku
102 Przygotowanie dokumentu do drukuImports System.Drawing.Printing ……………. Private Sub DrukP_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.StudenciTableAdapter1.Fill(TestDataSet1.Studenci) End Sub Private WithEvents DokDoDruku As New Printing.PrintDocument Private Sub Podglad_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Podglad.Click PrintPreviewDialog1.Document = DokDoDruku PrintPreviewDialog1.ShowDialog()
103 Przygotowanie obsługi zdarzenia
104 Private Sub document_PrintPage(ByVal sender As Object, _ByVal e As System.Drawing.Printing.PrintPageEventArgs) _ Handles DokDoDruku.PrintPage Dim i, wiersz As Integer Dim Linia As String Dim headerFont As New System.Drawing.Font _ ("ArialBold", 14, System.Drawing.FontStyle.Regular) Linia = " " & Microsoft.VisualBasic.Left(TestDataSet1.Studenci.Columns(2).Caption, 8) _ & " " & TestDataSet1.Studenci.Columns(1).Caption
105 wiersz = 20 e.Graphics.DrawString(Linia, headerFont, _ System.Drawing.Brushes.Black, 14, wiersz) Dim printFont As New System.Drawing.Font _ ("Arial", 10, System.Drawing.FontStyle.Regular) wiersz = wiersz + printFont.GetHeight(e.Graphics) e.Graphics.DrawLine(Pens.Black, 20, wiersz + 10, 200, wiersz + 10) For i = 0 To TestDataSet1.Studenci.Rows.Count - 1 Linia = " " & Microsoft.VisualBasic.Left(TestDataSet1.Studenci.Rows(i)("Imie"), 10) & ControlChars.Tab & TestDataSet1.Studenci.Rows(i)("Nazwisko") e.Graphics.DrawString(Linia, printFont, _ System.Drawing.Brushes.Black, 10, wiersz) Next End Sub
106 Wynik
107 Drukowanie z użyciem dialoguObsługa zdarzenia DokDoDruku.PrintPage pozostaje bez zmian
108 Obsługa przycisku Private Sub Drukarka_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Drukarka.Click PrintDialog1.AllowSomePages = True PrintDialog1.ShowHelp = True PrintDialog1.Document = DokDoDruku Dim result As DialogResult = PrintDialog1.ShowDialog() If (result = DialogResult.OK) Then DokDoDruku.Print() End If End Sub
109 Wynik
110 Drukowanie do pliku w formacie ekranuW tym trybie nie ma możliwości formatowania czcionki
111 Imports System.Drawing.PrintingImports System.IO …………………… Private Sub DoZboru_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DoZboru.Click SaveFileDialog1.InitialDirectory = "d:\" SaveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*" SaveFileDialog1.FilterIndex = 2 SaveFileDialog1.RestoreDirectory = True SaveFileDialog1.AddExtension = True SaveFileDialog1.CheckFileExists = True If SaveFileDialog1.ShowDialog() = DialogResult.OK Then If Not (SaveFileDialog1.FileName(0) = Nothing) Then FileOpen(1, SaveFileDialog1.FileName, OpenMode.Output) ' Open file for output. Print(1, "Lista studentów") ' Print text to file. Dim i As Integer
112 PrintLine(1) PrintLine(1, "Imie", TAB(), "Nazwisko") PrintLine(1, "________________________________________") For i = 0 To TestDataSet1.Studenci.Rows.Count - 1 PrintLine(1, Microsoft.VisualBasic.Left(TestDataSet1.Studenci.Rows(i)("Imie"), 10), TAB(), TestDataSet1.Studenci.Rows(i)("Nazwisko")) Next FileClose(1) End If End Sub
113 Efekt działania linii:If SaveFileDialog1.ShowDialog() = DialogResult.OK Then
114 Wynik
115 Drukowanie z pliku Istnieją problemy z formatowaniem
116 Dim WithEvents DoDruku As New PrintDocument()Dim printFont As New System.Drawing.Font _ ("Arial", 10, System.Drawing.FontStyle.Regular) Dim StrumienToPrint As StreamReader Private Sub ZeZbioru_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ZeZbioru.Click OpenFileDialog1.InitialDirectory = "d:\" OpenFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*" OpenFileDialog1.FilterIndex = 2 OpenFileDialog1.RestoreDirectory = True
117 If OpenFileDialog1.ShowDialog() = DialogResult.OK ThenTry StrumienToPrint = New StreamReader(OpenFileDialog1.FileName) AddHandler DoDruku.PrintPage, AddressOf Me.DoDruku_PrintPage PrintPreviewDialog1.Document = DoDruku PrintPreviewDialog1.ShowDialog() Finally StrumienToPrint.Close() End Try Catch ex As Exception MessageBox.Show(ex.Message) End If End Sub
118 Private Sub DoDruku_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles DoDruku.PrintPage Dim linesPerPage As Single = 0 Dim yPos As Single = 0 Dim count As Integer = 0 Dim leftMargin As Single = e.MarginBounds.Left Dim topMargin As Single = e.MarginBounds.Top Dim line As String = Nothing linesPerPage = e.MarginBounds.Height / printFont.GetHeight(e.Graphics)
119 While count < linesPerPageline = StrumienToPrint.ReadLine() If line Is Nothing Then Exit While End If yPos = topMargin + count * printFont.GetHeight(e.Graphics) e.Graphics.DrawString(line, printFont, Brushes.Black, leftMargin, yPos) ', New StringFormat()) count += 1 End While If Not (line Is Nothing) Then e.HasMorePages = True Else e.HasMorePages = False End Sub
120 Wynik