Guten Morgen alle zusammen,
ich habe eine Klasse geschrieben, diese möchte ich jetzt einbinden in mein Hauptprogramm. Leider funktioniert es nicht. Erst einmal eine allgemeine Frage, wie binde ich die Klasse ein. Mein erster Schritt war Hinzufügen->Klasse Hinzufügen, dann habe ich die Klasse ersteinmal geschrieben. Ich weiß schon gar nicht mehr was ich alles probiert habe und welche fehler Meldungen ich bekommen habe. Die letzte Fehlermeldung lautet im Moment
**
Eine nicht behandelte Ausnahme des Typs 'System.NullReferenceException' ist in Testen.exe aufgetreten.
Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.**
Habe auch schon hier im Forum gesucht, auch was gefunden aber hat leider nicht geholfen.
In meinem Hauptprogramm will ich über ein ButtonClick dann im Grunde das ausführen was in der Klasse steht. Die Neue Klasse soll Verschiedene Server erkennen und die Version auslesen und sie dann in einer ListView im Hauptprogramm anzeigen. Ich hoffe ich habe es gut genug erklärt.
Ich werde euch nochmal kurz den Code hier her packen
Mein Hauptprogramm:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Diagnostics;
using Microsoft.Win32;
using System.IO;
using System.Data.SqlClient;
using System.Data.OracleClient;
using System.Data.Common;
using System.Data.Odbc;
using System.Data.OleDb;
using Provider1;
namespace Testen
{
/// <summary>
/// Zusammenfassung für Form1.
/// </summary>
///
//public System.Windows.Forms.ListView listView1;
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
private System.Windows.Forms.ListView listView1;
private System.Windows.Forms.ColumnHeader columnHeader1;
private System.Windows.Forms.ColumnHeader columnHeader2;
private System.Windows.Forms.ColumnHeader columnHeader3;
private System.Windows.Forms.ColumnHeader columnHeader4;
/// <summary>
/// Erforderliche Designervariable.
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Erforderlich für die Windows Form-Designerunterstützung
//
InitializeComponent();
//
// TODO: Fügen Sie den Konstruktorcode nach dem Aufruf von InitializeComponent hinzu
//
}
/// <summary>
/// Die verwendeten Ressourcen bereinigen.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Vom Windows Form-Designer generierter Code
/// <summary>
/// Erforderliche Methode für die Designerunterstützung.
/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.listView1 = new System.Windows.Forms.ListView();
this.columnHeader1 = new System.Windows.Forms.ColumnHeader();
this.columnHeader2 = new System.Windows.Forms.ColumnHeader();
this.columnHeader3 = new System.Windows.Forms.ColumnHeader();
this.columnHeader4 = new System.Windows.Forms.ColumnHeader();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(8, 8);
this.button1.Name = "button1";
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// listView1
//
this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.columnHeader1,
this.columnHeader2,
this.columnHeader3,
this.columnHeader4});
this.listView1.GridLines = true;
this.listView1.Location = new System.Drawing.Point(128, 16);
this.listView1.Name = "listView1";
this.listView1.Size = new System.Drawing.Size(656, 192);
this.listView1.TabIndex = 1;
this.listView1.View = System.Windows.Forms.View.Details;
//
// columnHeader1
//
this.columnHeader1.Text = "Java";
this.columnHeader1.Width = 200;
//
// columnHeader2
//
this.columnHeader2.Text = "version";
this.columnHeader2.Width = 200;
//
// columnHeader3
//
this.columnHeader3.Text = "bla bla";
this.columnHeader3.Width = 200;
//
// columnHeader4
//
this.columnHeader4.Text = "blabalbaa";
this.columnHeader4.Width = 200;
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(832, 565);
this.Controls.Add(this.listView1);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// Der Haupteinstiegspunkt für die Anwendung.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void button1_Click(object sender, System.EventArgs e)
{
Provider p = new Provider();
}
}
}
Und hier meine Klasse:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Diagnostics;
using Microsoft.Win32;
using System.IO;
using System.Data.SqlClient;
using System.Data.OracleClient;
using System.Data.Common;
using System.Data.Odbc;
using System.Data.OleDb;
using Testen;
namespace Provider1
{
/// <summary>
/// Zusammenfassung für Provider.
/// </summary>
public class Provider
{
public System.Windows.Forms.ListView listView1;
private enum provider {sqlserver,oracle,oledb,odbc};
public Provider()
{
provider prov = new provider();
IDbConnection conn;
switch(prov)
{
case provider.sqlserver:
conn = new SqlConnection();
conn.ConnectionString ="server=KPxxxx;database=xxx_xxxxx;User ID=xxxxxxx;Password=xxxxxxx;Trusted_Connection=False";
IDbCommand comm = conn.CreateCommand();
comm.CommandText = "SELECT @@version";
conn.Open();
IDataReader myReader = comm.ExecuteReader();
ListViewItem Item = new ListViewItem("Server",0);
listView1.Items.Add(Item);
while(myReader.Read())
{
foreach(string line in myReader.GetString(0).Split('\r','\n','\t'))
{
if(line != string.Empty)
{
Item.SubItems.Add(line);
}
}
}
conn.Close();break;
case provider.oracle:
conn = new OracleConnection();break;
case provider.oledb:
conn = new OleDbConnection();break;
case provider.odbc:
conn = new OdbcConnection();break;
}
//
// TODO: Fügen Sie hier die Konstruktorlogik hinzu
//
}
}
}
Ich hoffe einer kann mir helfen! Ist mit Sicherheit ganz simpel, aber habe noch nicht viel bzw gar nicht mit Klassen gearbeitet.
Ciao Olli
Hallo myBig?!
Könntest Du hier noch mit angeben wo der Fehler auftritt (welche Zeile)?
Das wäre dann wesentlich einfacher zu beantworten.
Ciao
Norman-Timo
A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”
Die Fehlermeldung die du gepostet hast, sieht ganz danach aus, als ob du versuchst eine Variable oder ein Objekt zu benutzen, ohne es initialisiert zu haben.
Zum Klassen einbinden:
Du hast in deiner Klasse einen Konstruktor.
public Provider()
{
...
}
Mit dem kannst du jetzt Objektinstanzen erstellen. z.B. so:
...
namespace Testen
{
public class Form1 : System.Windows.Forms.Form
{
Provider p = new Provider(); // neue Instanz deiner Klasse Provider
public Form1()
{
//
// Erforderlich für die Windows Form-Designerunterstützung
//
InitializeComponent();
p.IrgendEineÖffentlicheMethodeDeinerKlasse(); // Methoden-Aufruf deiner Klasse
Soweit erstmal dazu, wenn du noch konkrete Fragen hast, hau rein. 😁
Mfg SGT_BOB
*************************
Ich bin root, ich darf das... 😜
root>_
*************************
Hallo Norman,
der Fehler taucht in der Klasse auf und zwar in dieser Zeile
listView1.Items.Add(Item);
Sie ist Gelb hinterlegt.
Ciao Olli
private enum provider {sqlserver,oracle,oledb,odbc};
public Provider()
{
provider prov = new provider();
...
switch(prov)
{
....
}
ich vermute mal das dein Fehler mit dem benutzen des enum's zu tun hat?!
//edit:
ok anscheinend doch nicht das enum.... X(
Gib mal das hier
MessageBox.Show("Item: " + Item.Text, "Test",
MessageBoxButtons.OK);
hinter dem hier
ListViewItem Item = new ListViewItem("Server",0);
ein. Dann sollte eine MessageBox aufgehen die dir den Text des ListViewItems anzeigt. Für mich sieht das auf den ersten Blick richtig aus.
*************************
Ich bin root, ich darf das... 😜
root>_
*************************
Halt!!!
Kommando zurück.
Ich glaube du versuchst auf ein privates Member zuzugreifen.
Siehe hier:
private System.Windows.Forms.ListView listView1;
Erstze mal bitte zum testen private mit public
So hier:
public System.Windows.Forms.ListView listView1;
Das Member ist durch private nach außen hin unsichtbar.
*************************
Ich bin root, ich darf das... 😜
root>_
*************************
Da kommt dann Server raus, aber die Fehlermeldung bleibt. Die kommt direkt im Anschluss. Oder habe ich die Klasse nicht richtig eingebunden? Weiß echt nicht was ich falsch mache. 😭 🤔
Daran liegt es leider auch nicht, hatte ich auch schon dran gedacht. Habe es auch jetzt nochmal versucht. Kommt wieder die gleich Fehlermeldung in der gleichen Zeile.
Hallo myBig?!
So wie eben SGT_BOB erwähnt hat, ist Dein listView1 in Deiner "Hauptklasse" definiert. Dann kannst Du nur mit den folgenden Möglichkeiten von anderen Klassen darauf zugreifen:
Schau Dir mal das Prinzip an, wenn Du von einer Form1 auf eine Form2 zugreifen möchtest (Das ist das selbe wie von Klasse1 auf Klasse2!) -> Forumssuche
Ciao
Norman-Timo
[EDIT] Du hast auch kein Zugriff von Deiner eingebundenen Klasse auf Deine Form1-Klasse, deshalb reicht ein "nur auf public umstellen" nicht! [/EDIT]
A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”
Probiers mal so:
Klasse Provider:
public class Provider
{
// ...
public Provider(ListView listView) // du übergibst dem Konstruktor die ListView
{
// ...
ListViewItem Item = new ListViewItem("Server",0);
while(myReader.Read())
{
foreach(string line in myReader.GetString(0).Split('r','n','t'))
{
if(line != string.Empty)
{
Item.SubItems.Add(line);
}
}
}
listView.Items.Add(Item); // das sollte hier her, damit auch die SubItems berücksichtigt werden
// ...
}
}
}
In Hauptklasse:
// ...
private void button1_Click(object sender, System.EventArgs e)
{
Provider p = new Provider(listView1);
}
// ...
progger
A wise man can learn more from a foolish question than a fool can learn from a wise answer!
Bruce Lee
Populanten von Domizilen mit fragiler, transparenter Außenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
Wer im Glashaus sitzt, sollte nicht mit Steinen werfen.
Hallo Progger,
die Fehlermeldung ist jetzt weg, es läuft auch wunderbar durch. Allerdings wird es nicht in der listView1 angezeigt. Brauch ich noch irgendeine Zuweisung oder woran liegt es?
Ciao Olli
HALT!!!!
Ich glaube ich habe den Fehler gefunden. Moment ich versuche es nochmal.
Jupps, jetzt läuft es! Danke nochmal!!!
Aber jetzt nochmal eine Frage ist es denn immer so "kompliziert"? Ich dachte das wäre recht einfach. Eine Klasse schreiben, dann über using eine Verbindung zwischen den Klassen schreiben und schon kommunizieren die miteinander. Hat noch einer eine gute Seite wo ich mich mit Klassen mal beschäftigen kann? Werde mir auch nochmal das von Norman suchen was hier im Forum sein soll.
Ciao Olli
Es ist eingentlich recht logisch, dass man nicht einfach so kommunizieren kann. Folgender Fall:
Du hast eine Klasse A und eine Klasse B. Klasse B ist eine selbstgeschriebene MessageBoc mit einem Label "lblText", das über eine Eigenschaft "Label" nach draußen gereicht wird. Nun erstellst du in Klasse A zwei solcher Messageboxen, eine für Fehler eine für erfolgreiche Operation. Nun ist doch eigentlich logisch, dass du nicht einfach über Label.Text="Fehler!" etwas zuweisen kannst. Du musst schon schreiben welcher Messagebox du den Text zuweisen willst: z.B. msgFehler.Label.Text="Fehler!".
Das ist ein kleines Bsp., das dir, hoffe ich, veranschaulicht, warum du nicht einfach ohne Instenz mit Klassen kommunizieren kannst.
progger
A wise man can learn more from a foolish question than a fool can learn from a wise answer!
Bruce Lee
Populanten von Domizilen mit fragiler, transparenter Außenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
Wer im Glashaus sitzt, sollte nicht mit Steinen werfen.
Hallo MyBig?!
Also grundsätzlich ist bei der Definition von Variablen und Methoden etc... innerhalb einer Klasse immer darauf zu achten, muss diese Variable, Methode... jetzt nur innerhalb der Klasse verwendet werden, oder müssen diese auch von außen sichtbar sein.
Deshalb gibt es hier die Bezeichner "public", "private" und "protected".
Damit jetzt 2 Objekte (Instanzen einer Klasse) miteinander kommunizieren können, so müsssen sich beide kennen (beim Namen). Dann ist es auch möglich gegenseitig auf "public" Variablen, Methoden... zuzugreifen.
Schematisch sieht es dann so aus:
Klasse A -> Objekt wird erstellt Obj1
Klasse B -> Objekt wird erstellt Obj2
jetzt kann innerhalb von Obj1 nur ein Zugriff Obj2.Irgendwas erfolgen, wenn Obj2 innerhalb von Obj1 bekannt ist (als eigene Variable). Und ungekehrt.
Als Beispiel:
public class A
{
public int myInteger = 9;
public A()
{
}
}
public class B
{
A querverweis = new A();
public B()
{
}
}
Das sind die Definitionen (Klassen).
Zur Anwendung kommt das dann so (an anderer Stelle):
B meinNeuesObjekt = new B();
B.querverweis.myInteger = 5;
Somit hast Du das Objekt "querverweis" (Klasse A) automatisch dem Objekt "meinNeuesObjekt" (Klasse B) bekannt gemacht, und nun kann "querverweis" auch auf "public" Elemente des Objektes zugreifen.
Hoffe dass das verständlich war?
Objektorientierte Programmierung ist halt doch nicht was, was man auf Anhieb richtig versteht, das ist klar...
Ciao
Norman-Timo
A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”
Ist sehr einfach und damit ein guter Einstieg.
Oder ein Einsteiger-Buch:
C# in 21 Tagen
Markt und Technik
gute Gliederung, einfache Formulierung
Mfg SGT_BOB
// edit:
Wenn du schon ein wenig Programmiererfahrung hast, gibt es in dem Tutorial oben auch einen Schnelleinstieg.
*************************
Ich bin root, ich darf das... 😜
root>_
*************************
Ich werde mir das jetzt mal zu gemühte führen. Und alles in Ruhe nochmal von euch so anschauen. Ich hoffe ich verstehe es dann. Wenn noch fragen auftauchen, werde ich mich wieder melden. Ich hoffe, dass ihr mir dann weiter helfen könnt.
Schon mal vielen dank für die gute Hilfe und Unterstützung!
Ciao Olli