Autor Beitrag
lapadula
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 180
Erhaltene Danke: 10



BeitragVerfasst: Fr 19.08.16 18:50 
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:

ausblenden 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?


ausblenden volle Höhe 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); //TestDemo
            connectString.Add("Data Source", textBox1.Text); //RK-WIN10\\SQLEXPRESS
            connectString.Add("User ID", textBox3.Text); //sa
            connectString.Add("Password", textBox4.Text); // masterkey
            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(1010), 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;

            //Add the ListView to the control collection.
            this.tabControl1.TabPages[i].Controls.Add(listView);
        }
    }
}


Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 19.08.16 20:46 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: lapadula
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
// in button2_Click
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.

Für diesen Beitrag haben gedankt: lapadula
lapadula Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 180
Erhaltene Danke: 10



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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):
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
ListView CreateListView()
{
  ListView listview = new ListView();
  // ...

  // evtl. hier direkt (oder aber nach dem Aufruf dieser Methode)
  listviews.Add(listview);

  return listview;
}
lapadula Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 180
Erhaltene Danke: 10



BeitragVerfasst: 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 :/