Laden...

Klasse einbinden

Erstellt von myBig? vor 18 Jahren Letzter Beitrag vor 18 Jahren 3.837 Views
M
myBig? Themenstarter:in
241 Beiträge seit 2005
vor 18 Jahren
Klasse einbinden

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

4.506 Beiträge seit 2004
vor 18 Jahren

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!”

S
125 Beiträge seit 2005
vor 18 Jahren

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>_
*************************

M
myBig? Themenstarter:in
241 Beiträge seit 2005
vor 18 Jahren

Hallo Norman,

der Fehler taucht in der Klasse auf und zwar in dieser Zeile


listView1.Items.Add(Item);

Sie ist Gelb hinterlegt.
Ciao Olli

N
750 Beiträge seit 2004
vor 18 Jahren

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(

?( wer suchet, der findet auch! :]

S
125 Beiträge seit 2005
vor 18 Jahren

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>_
*************************

S
125 Beiträge seit 2005
vor 18 Jahren

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>_
*************************

M
myBig? Themenstarter:in
241 Beiträge seit 2005
vor 18 Jahren

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. 😭 🤔

M
myBig? Themenstarter:in
241 Beiträge seit 2005
vor 18 Jahren

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.

4.506 Beiträge seit 2004
vor 18 Jahren

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:

  • In der Hauptklasse das listView1 als "public" deklarieren -> unschön.
  • Properties in der Hauptklasse einfügen, die Dir die Liste füllen
  • Eine Methode in Deiner Hauptklasse definieren, Die Dir die Liste befüllt.

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!”

1.271 Beiträge seit 2005
vor 18 Jahren

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.

M
myBig? Themenstarter:in
241 Beiträge seit 2005
vor 18 Jahren

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

M
myBig? Themenstarter:in
241 Beiträge seit 2005
vor 18 Jahren

HALT!!!!
Ich glaube ich habe den Fehler gefunden. Moment ich versuche es nochmal.

M
myBig? Themenstarter:in
241 Beiträge seit 2005
vor 18 Jahren

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

1.271 Beiträge seit 2005
vor 18 Jahren

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.

4.506 Beiträge seit 2004
vor 18 Jahren

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!”

S
125 Beiträge seit 2005
vor 18 Jahren

Ist sehr einfach und damit ein guter Einstieg.

Tutorial

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>_
*************************

M
myBig? Themenstarter:in
241 Beiträge seit 2005
vor 18 Jahren

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