1
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 1
Grundlagen in C# und .net
Dipl.-Inf., Dipl.-Ing. (FH) Michael Wilhelm
Hochschule Harz
FB Automatisierung und Informatik
mwilhelm@hs-harz.de
Raum 2.202
Tel. 03943 / 659 338
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 2
Inhalt
■
TabbedPane (Register)
■
ListView
■
Tree
■
Tabelle
■
MDI-Programme
■
Erweiterte Grafik
■
Threads und Semaphore
■
Datenbanken
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 3 Mögliche Varianten
oODBC Providers (Excel, Access, Textdatei, AS 400, DB2)
oOLE DB Data Providers (Excel, Access, Textdatei, AS 400, DB2)
oOLE DB Data Link (Data Link File UDL)
oNet-Provider
oADO.net
oLINQ (Language Integrated Query)
oWindows Forms vs. Windows Presentation Foundation Datenbank-Unterstützung
oAccess
oMS SQL Server (Express Edition bis 2GB)
oMySQL
oFirebird (Server und Embed Version)
oOracle (Microsoft, Oracle, Corelab)
oPostgre (Corelab)
oSybase
oVistaDB
Datenbanken
Mögliche GUI-Varianten
oDataGridView
oEinbau der FK in das Grid (ComboBox)
oMaster / Details (DetailsView, nur ein Datensatz)
oGruppenwechsel mit Editzeile, ComboBox, Checkbox, ListView etc.
Weitere Eigenschaften
oAufruf eines Filters
oVirtualMode für sehr große Datenmengen
oAuslesen der Tabellen in der Datenbank
oAuslesen der Attribute mit Datentypen pro Tabelle
oAuslesen der Fremdschlüssel etc. pro Tabelle
Datenbanken
3
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 5
Ablauf
oKopieren der Datenbanken (Employee.mdb)
oErstellen eines Projektes
oEinbau eines DataGridView
oAuswahl der employee.mdb im Entwurfsmodus
oChoose Data Source
oAdd Project DataSource
oDatabase (Doppelklick)
oNew Connection
Datenbanken erstellen mit MS Access
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 6
Acces-Datenbanken
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 7
Acces-Datenbanken: BindingNavigator einfügen
Acces-Datenbanken: DataGridView einfügen
•
Projektdatenquelle auswählen
5
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 9
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 10
FB Automatisierung und Informatik: GUI mit Visual Studio: .net
private void Form1_Load(object sender, EventArgs e) {
dataGridView1.Dock = DockStyle.Fill;
/* TODO: Diese Codezeile lädt Daten in die Tabelle
"employeeDataSet.EMPLOYEE". Sie können sie bei Bedarf verschieben oder entfernen.
*/
this.eMPLOYEETableAdapter.Fill(this.employeeDataSet.EMPLOYEE);
bindingNavigator1.BindingSource = eMPLOYEEBindingSource;
}
Acces-Datenbanken: Form_Load (automatisch)
7
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 13
private void Form1_Load(object sender, EventArgs e) {
dataGridView1.Dock = DockStyle.Fill;
eMPLOYEETableAdapter.Fill(
this.employeeDataSet.EMPLOYEE ); // automatisch
bindingNavigator1.BindingSource = eMPLOYEEBindingSource;
}
Access-Datenbanken
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 14
Ergebnis
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 15 Struktur
oDer .net Provider für Firebird und andere DBS kapselt alle Zugriffe auf die Datenbank
oVollständig in C# geschrieben
oFunktionen:
-Connection
-GetSchema
-Open
-Close
-BeginTransaction
-ChangeDatabase
-CreateCommand
-Dispose
-State (Status: Open Close)
-FbConnection.CreateDatabase
-FbConnection.DropDatabase
-FbConnection.ClearAllPools
-FbConnection.ClearPool
Datenbanken mit .net Provider erstellen
Voraussetzungen
oFirebird Server installiert
oFirebird Client-Installation
oFirebird Embed-Version, einfache DLL
o.net Provider für Firebird
oab Visual Studio 2005 Ablauf
oErstellen eines Projektes
oEinbinden des Providers
oErstellen einer DBS-Klasse (Kapselung)
oErstellen einer Query-Klasse (Kapselung)
oAufbau der GUI (DataGridView)
oErstellen einer Verbindung (connection)
oSQL-Befehl holen
oQuery-Abfrage starten
oDataTable dem Grid zuweisen
Datenbanken erstellen mit Firebird
9
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 17 Firebird type .NET type FbDataReader
Methode
Example
BIGINT System.Int64 GetInt64() BIGINT Reading Example (C#) BLOB System.Byte[] GetBytes() BLOB Reading Example (C#) BLOB
SUB_TYPE 1
System.String GetString() BLOB SUB_TYPE 1 Reading Example (C#)
CHAR System.String GetString() CHAR Reading Example (C#) DATE System.DateTime GetDateTime() DATE Reading Example (C#) DECIMAL System.Decimal GetDecimal() DECIMAL Reading Example (C#) DOUBLE
PRECISION
System.Double GetDouble() DOUBLE PRECISION Reading Example (C#)
FLOAT System.Float GetFloat() FLOAT Reading Example (C#) INTEGER System.Int32 GetInt32() INTEGER Reading Example (C#) NUMERIC System.Decimal GetDecimal() NUMERIC Reading Example (C#) SMALLINT System.Int16 GetInt16() SMALLINT Reading Example (C#) TIME System.DateTime GetDateTime() TIME Reading Example (C#) TIMESTAMP System.DateTime GetDateTime() TIMESTAMP Reading Example
(C#)
VARCHAR System.String GetString() VARCHAR Reading Example (C#)
Vergleich Firebird und .net Datentypen
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 18
DBS Connection
DataTable 1 Tabelle
DataSet n Tabelle Binding
DataGridView
Textfield
CheckBox
Navigator
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 19
FbConnection cnn = new FbConnection(sArg);
public DataTable getDBSData(string sSQL) {
//FbCommand command = new FbCommand(sSQL, _cnn);
FbDataAdapter da = new FbDataAdapter(sSQL, _cnn);
DataTable dt = new DataTable("RELATIONS");
da.Fill(dt); // füllt die DataTable mit Daten return dt;
}
// hier kann man mehrere Tabellen erhalten
public DataSet getDBSDataSet(string sSQL, string sTable) { //FbCommand command = new FbCommand(sSQL, _cnn);
FbDataAdapter da = new FbDataAdapter(sSQL, _cnn);
DataSet ds = new DataSet();
da.Fill(ds, sTable); // z. B. "Employee", wichtig da es mehrere gibt return ds;
}
string sFilename = "EMPLOYEE.FDB";
string sSQL1 = "select * from EMPLOYEE";
_dbs.setDbs(sFilename);
DataTabledtSqlGrid1 = _dbs.getDBSData(sSQL1);
DBGrid1.DataSource = dtSqlGrid1;
Abfrage einer SQL-Anweisung: Direkte Zuweisung zum Grid
string sFilename = "EMPLOYEE.FDB";
string sSQL1 = "select * from EMPLOYEE";
_dbs.setDbs(sFilename);
DataSet ds1 = _dbs.getDBSDataSet(sSQL1, "EMPLOYEE");
DBGrid1.DataSource = ds1.Tables["EMPLOYEE"];
11
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 21
string sFilename = "EMPLOYEE.FDB";
string sSQL1 = "select * from EMPLOYEE";
_dbs.setDbs(sFilename);
DataTabledtSqlGrid1 = _dbs.getDBSData(sSQL1);
bindingSource1.DataSource = dtSqlGrid1;
bindingNavigator1.BindingSource = bindingSource1;
DBGrid1.DataSource = bindingSource1;
Binding emp_no_binding = new Binding("Text", bindingSource1, "EMP_NO");
EEMP_NO.DataBindings.Add(emp_no_binding);
Abfrage einer SQL-Anweisung: Mit Navigator
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 22
string sFilename = "EMPLOYEE.FDB";
string sSQL1 = "select * from EMPLOYEE";
_dbs.setDbs(sFilename);
DataSet ds1= _dbs.getDBSDataSet(sSQL1, "EMPLOYEE");
bindingSource1.DataSource = ds1.Tables["EMPLOYEE"];
bindingNavigator1.BindingSource = bindingSource1;
DBGrid1.DataSource = bindingSource1;
Binding emp_no_binding = new Binding("Text", bindingSource1, "EMP_NO");
EEMP_NO.DataBindings.Add(emp_no_binding);
Abfrage einer SQL-Anweisung: Mit Navigator
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 23 Ablauf
oErstellen eines Projektes: C:\daten\dbs_firebird1
oGUI-Elemente einfügen (siehe nächste Seite)
o Taste F7, Kopieren der Datenbank-Dateien
oEinbinden des Providers
-Projektbaum öffnen
-Rechte Maustaste über "References"
-Eintrag "Add Reference"
-Register Browse
-Datei :"FirebirdSql.Data.FirebirdClient.dll"
oErstellen einer DBS-Klasse (Kapselung)
oErstellen einer Query-Klasse (Kapselung, optional)
oErstellen einer Verbindung (connection)
oSQL-Befehl holen
oQuery-Abfrage starten
oDataTable dem Grid zuweisen
2. Datenbankbeispiel
ToolStrip:
- Label Tabelle,
- ComboBox ListTabelle: DropDownList,
- ComboBox ListAttribute: DropDownList
- BnStart, enabled=false
SplitContainer einfügen - FixedPanel: Panel1
DataGridView einfügen
Editor:
-Multiline=true,
-Name=EQuery
13
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 25
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 26 Ablauf
oErstellen eines Projektes: d:\daten\dbsconsole
oGUI-Elemente einfügen (siehe nächste Seite)
o Taste F7, Kopieren der Datenbank-Dateien
oEinbinden des Providers
-Projektbaum öffnen
-Rechte Maustaste über "References"
-Register Browse
-Datei :"FirebirdSql.Data.FirebirdClient.dll"
oErstellen einer DBS-Klasse Dbs, (Kapselung)
oErstellen einer Verbindung (connection)
oSQL-Befehl holen
oQuery-Abfrage starten
oDataTable dem Grid zuweisen
3. Datenbankbeispiel: DbConsole
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 27
public DataTable getTables() { string[] filter = new string[4];
filter[0] = "dbo"; // null;
filter[1] = null;
filter[2] = null;
filter[3] = null;
DataTable dt;
dt = _dbs.GetSchema("Tables", filter);
return dt;
}
Methode zum Füllen der Datenbank-Daten listBox1.Items.Clear();
for (int row = 0; row < _dtDataBase.Rows.Count; row++) { string sTabletyp = (string)_dtDataBase.Rows[row][3];
if (sTabletyp.Equals("TABLE"))
listBox1.Items.Add(_dtDataBase.Rows[row][2].ToString());
}
listBox1.SelectedIndex = 0;
DbConsole: Ermitteln der Datenbankstruktur
15
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 29
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 30
Problem: Automatisches Berechnen der Spaltengröße
• Beim Zuweisen der dataTable zum Grid wird beim Eintragen jeder Zelle die Tabelle bzgl. der Spaltengröße optimiert. Dies kann sehr lange dauern.
• Abhilfe:
DateTime Time1, Time2;
DataTable dt1 = _dbs.getDBSData(sSQL);
Grid1.Visible = false;
Grid1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
Grid1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
Time1 = DateTime.Now;
Grid1.DataSource = dt1; // Hier Zuweisen der dataTable bzw. DataSet
Grid1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader;
Grid1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
Time2 = DateTime.Now;
Grid1.Visible = true;
TimeSpan duration1 = Time2 - Time1;
Text = "Zeit: " + duration1; // Ausgabe der Zeitdauer
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 31 Zeigt eine Spalte in der Fremdschlüsseltabelle
Datenbank-ComboBox
Tabelle Employee
•
Empno
•
Lastname
•
Firstname
•
Dept_no
Tabelle Department
•
Dept_no
•
Department
•
Location
Datenbank-ComboBox
17
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 33
Datenbank-ComboBox: dbs3
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 34 Ablauf
oErstellen eines Projektes: d:\daten\dbs3
oGUI-Elemente einfügen (Panel, Schalter, dataGridView)
odataGridView1.Dock = DockStyle.Fill;
oTaste F7, Kopieren der Datenbank-Dateien
oErstellen einer neuen Klasse „Dbs“
oEinfügen des Quellcodes
oEinbinden des Providers
-Projektbaum öffnen
-Rechte Maustaste über "References / Verweise"
-Register Browse / Durchsuchen
-Datei :"FirebirdSql.Data.FirebirdClient.dll"
3. Datenbankbeispiel: dbs3
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 35 BnStart-OnClick-Event
public partial class Form1 : Form {
Dbs _dbs;
private void Form1_Load(object sender, EventArgs e) {
dataGridView1.Dock = DockStyle.Fill;
_dbs = new Dbs();
}
}
3. Datenbankbeispiel: dbs3
BnStart-OnClick-Event
public partial class Form1 : Form {
private void BnStart_Click(object sender, EventArgs e) {
_dbs.setDbs("Employee.FDB");
String sSQL = "select * from Employee";
DataTable dt1 = _dbs.getDBSData(sSQL);
dataGridView1.DataSource = dt1;
} }
3. Datenbankbeispiel: dbs3
19
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 37
string sSQL2 = "select * from Department";
DataTable dt2 = _dbs.getDBSData(sSQL2);
DataGridViewComboBoxColumn cbcol = new DataGridViewComboBoxColumn();
cbcol.DataSource = dt2;
cbcol.DataPropertyName = "DEPT_NO";
cbcol.ValueMember = "DEPT_NO";
cbcol.DisplayMember = "Department";
cbcol.HeaderText = "Abteilungen";
cbcol.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;
dataGridView1.Columns.Add(cbcol); // oder Insert
Datenbank-ComboBox
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 38 Zeigt eine Spalte in der Fremdschlüsseltabelle
Master-Detail-Tabellen dbs4
Tabelle Employee
•
Empno
•
Lastname
•
Firstname
•
Dept_no Tabelle Department
•
Dept_no
•
Department
•
Location
select * from Department select *
from Employee
where dept_no=iDept_no iDept_no
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 39
Master-Detail-Tabellen
Ablauf
oErstellen eines Projektes: d:\daten\dbs4
oGUI-Elemente einfügen (Label, TextBox, Panel, Schalter,)
oEinfügen eines SplitContainers
oOrientation: Horizontal
oEinfügen zweiter DataGridView
odataGridView1.Dock = DockStyle.Fill;
odataGridView2.Dock = DockStyle.Fill;
oTaste F7, Kopieren der Datenbank-Dateien
oErstellen einer neuen Klasse „Dbs“
oEinfügen des Quellcodes
oEinbinden des Providers
-Projektbaum öffnen
-Rechte Maustaste über "References / Verweise"
-Register Browse / Durchsuchen
-Datei :"FirebirdSql.Data.FirebirdClient.dll"
4. Datenbankbeispiel: dbs4
21
FB Automatisierung und Informatik: GUI mit Visual Studio: .net
Master-Detail-Tabellen: Aufbau Name: ESql
Abteilungen
Mitarbeiter
FB Automatisierung und Informatik: GUI mit Visual Studio: .net 42
■
Verknüpfen der Mastertabelle mit dem Event "SelectionChanged"
■
Holen der aktuellen Zeile, Dept_no
■
Aufbau einer neuen SQL-Abfrage, where dept_no = iDept_no
■
Setzen des DataSet
Master-Detail-Tabellen
Quellcode:
DataGridViewRow row = dataGridView1.CurrentRow;
DataGridViewCell zelle = row.Cells[0];
String sDeptNo = zelle.Value.ToString();
ESql.Text = sDeptNo;
string sSQL2 = "select * from Employee where Dept_no = " + sDeptNo;
DataTable dt2 = _dbs.getDBSData(sSQL2);
dataGridView2.DataSource = dt2; // _dbs.getDBSData(sSQL2);