Entwickler-Ecke
WinForms - Datenbank auslesen und in ListView schreiben
lapadula - Fr 19.08.16 18:50
Titel: Datenbank auslesen und in ListView schreiben
Hallo, ich komme an einer Stelle nicht weiter und bräuchte Hilfe.
- Und zwar soll das Programm sich mit einem Server verbinden. (Button1)
- Die Namen aller Datenbanken auslesen und in "Tabs" geschrieben werden. (Button2)
- Danach die Tabellennamen der Datenbanken auslesen und in eine die passenden Tabs
in eine ListView geschrieben werden (Button3)
Punkt 1 und 2 funktioniert soweit. Jetzt habe ich das Problem, dass wenn ich die Tabellen-Namen aus der Datenbank "master" in die ListView schreibe, er den letzten Tab dafür nimmt. Die Datenbank "master" ist aber bereits der erste Tab.
Ich hab ein wenig rumexperimentiert und die ausgelesenen Datenbanknamen und Tabellennamen in ArrayList gepackt. Meine Idee war folgende:
C#-Quelltext
1:
| DatenbankArr[0] = listView.Columns.Add(TabellenArr[...].ToString()); |
In Worten: Nimm den ersten Datenbanknamen (0) und schreibe dort die Tabellennamen rein, die im "TabellenArr"-ListArray liegen.
Nun frage ich mich wie er denn wissen soll, das das erste Element in DatenbankArr zum ERSTEN Tab gehört und hier weiss ich nicht weiter.
Davor habe ich versuch die Tabs anzusprechen, wusste auch da auch nicht so recht wie ich das machen soll. Mit Indexof?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; using System.Data.Sql; using System.Collections;
namespace DBAnalysierer { public partial class Form1 : Form { private SqlConnection connection; private ArrayList DatenbankArr; private ArrayList TabellenArr; private ListView listView; public Form1() { InitializeComponent(); textBox1.Text = "RK-WIN10\\SQLEXPRESS"; textBox2.Text = "TestDemo"; textBox3.Text = "sa"; textBox4.Text = "masterkey"; } private void button1_Click(object sender, EventArgs e) { SqlConnectionStringBuilder connectString = new SqlConnectionStringBuilder(); connectString.Add("Database", textBox2.Text); connectString.Add("Data Source", textBox1.Text); connectString.Add("User ID", textBox3.Text); connectString.Add("Password", textBox4.Text); connection = new SqlConnection(); connection.ConnectionString = connectString.ToString();
try { connection.Open(); } catch { MessageBox.Show("Es konnte keine Verbindung hergestellt werden"); } }
private void button2_Click(object sender, EventArgs e) { SqlDataReader myReader = null; SqlCommand myCommand = new SqlCommand("select name from sys.sysdatabases", connection); myReader = myCommand.ExecuteReader();
DatenbankArr = new ArrayList();
while (myReader.Read()) { tabControl1.TabPages.Add(myReader["name"].ToString()); ListViewCreator(); DatenbankArr.Add(myReader["name"]); } myReader.Close(); }
private void button3_Click(object sender, EventArgs e) { SqlDataReader myReader = null; SqlCommand myCommand = new SqlCommand("USE master select table_name from INFORMATION_SCHEMA.tables", connection); myReader = myCommand.ExecuteReader();
TabellenArr = new ArrayList();
while (myReader.Read()) { listView.Columns.Add(myReader["table_name"].ToString()); TabellenArr.Add(myReader["table_name"]); } myReader.Close(); }
public void ListViewCreator() {
listView = new ListView(); listView.Bounds = new Rectangle(new Point(10, 10), new Size(tabControl1.Width - 30, tabControl1.Height - 30)); listView.View = View.Details; listView.LabelEdit = false; listView.AllowColumnReorder = true; listView.FullRowSelect = true; listView.GridLines = true; ColumnHeader column1 = new ColumnHeader(); column1.Width = 159; column1.TextAlign = HorizontalAlignment.Left;
int i = tabControl1.TabCount - 1;
this.tabControl1.TabPages[i].Controls.Add(listView); } } } |
Moderiert von
Th69: C#-Tags hinzugefügt
Delete - Fr 19.08.16 20:46
- Nachträglich durch die Entwickler-Ecke gelöscht -
Th69 - Sa 20.08.16 10:09
Hallo,
@Frühlingsrolle: deine erste Zeile bzgl.
tabControl1.TabIndex bezeichnet etwas anderes (nämlich die Aktivierungsreihenfolge mittels der Tabulator-Taste ;- ).
@lapadula: die 2. Zeile aber ist passend für dich, d.h. der
index entspricht dann einfach deinem Array-Index (bzw. auch ich empfehle dir hierfür
List<string> zu benutzen -
ArrayList ist veraltet (
deprecated)).
Du solltest daher deiner Methode
ListViewCreator als Parameter den Index übergeben - und in deiner Leseschleife den Index als Variable benutzen - in etwa so
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| int index = 0;
while (myReader.Read()) { tabControl1.TabPages.Add(myReader["name"].ToString()); ListViewCreator(index); DatenbankArr.Add(myReader["name"]);
index++; } |
(Persönlich würde ich sogar nur die gerade angelegte
TabPage als Parameter dieser Methode übergeben).
Wenn ich die Aufgabenstellung aber richtig verstehe, dann sollst du erst in
button3_Click die ListViews für alle Tabs erzeugen, d.h. dort dann eine Schleife über dein
DatenbankArr und für jede Datenbank dann deren Tabellen im ListView anzeigen.
lapadula - Mo 22.08.16 11:50
Okay, ich verwende List<string> :)
Trotzdem steh ich aufm Schlauch. Ich weiss nicht wie ich die Listview im ersten Tab anvisieren kann.
Ich möchte sowas wie: Tab1 = listView.Columns.Add("Spalte1");,
Nach der ersten while-Schleife hat die List z. B. die Strings: "eins", "zwei", "drei"
Die Variable index wird dabei auch hochgezählt, diesse hat nach der Schleife den Wert 3
da findet aber doch keine logische Verbindung statt wie: "eins" = index 0, "zwei" = index1, "drei" = index2
Die ListViewCreater()-Methode ist in der ersten while-Schleife, damit er gleich sofort die listViews entsprechend der Anzahl an Tabs erzeugt.
Th69 - Mo 22.08.16 14:57
Ich glaube, du machst es dir zu kompliziert, wenn du versuchst wieder das ListView aus den einzelnen TabPages zu ermitteln (denn dann müßtest du umgekehrt wieder auf
TabPage.Controls zugreifen und daraus dann das ListView ermitteln).
Speichere einfach analog zu deinen Datenbanken die ListViews in einer
List<ListView>, so daß du dann über den Index direkt darauf zugreifen kannst.
Dazu solltest du nur die
ListViewCreator-Methode entsprechend ändern:
entweder die erzeugte
ListView als Rückgabewert definieren (und nach dem Aufruf der obigen
List<ListView> hinzufügen) oder letzteres gleich in dieser Methode ausführen.
PS: Die bisherige Membervariable
listview solltest du daher besser einfach als lokale Variable innerhalb der Methode anlegen (denn es gibt ja jetzt mehrere ListViews):
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| ListView CreateListView() { ListView listview = new ListView(); listviews.Add(listview);
return listview; } |
lapadula - Mo 22.08.16 21:04
Vielen Dank, das hat super geklappt.
Manchmal sitze ich verdammt lange an Kleinigkeiten und seh den Wald vor lauter Bäume nicht mehr :/
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!