module in vb, aber was in c#

rainerdam

Mitglied
Hallo,
wie kann ich im Projekt von verschiedenen aspx Seiten auf eine Funktion zugreifen?
Bei vb.net kann man diese Funktionen ja in Modulen speicher und drauf zu greife, aber in c# find ich das nicht.
Bin ich nur zu bloed das zu finden oder gibts in c# ein anderes System?

danke schone

cu

RAiner
 
ok danke schoen
Muss ich dann die Klasse in den aspx Seiten noch irgendwie ansprechen oder reicht da das Einbinden voellig aus und ich kann die Funktionsaufrufe so lassen, wie sie jetzt sind.(und muss nicht noch sagen, dass sie in der Klasse sind)
 
Ein Grundprinzip der objektorientierten Programmierung ist es, daß es keine Funktionen mehr gibt, sondern nur noch Methoden, die an Objekte gebunden sind.

Du packst deine Methode z.B. in eine Klasse und benennst den Namespace und die Klasse beliebig.

Code:
namespace Test.Test {
      public class Testklasse
      {
         public void Methodenname(Parameterliste);
      }
}

Anschließend bindest du den Namespace in die Seite ein, in der du sie benötigst (über using):


Code:
using Test.Test;

Du musst die Klasse dort instanziieren und kannst die Methode über den Befehl:

Klassenname.Methodenname

aufrufen:

Code:
Testklasse tk = new Testklasse();
tk.Methodenname();

Alternativ könntest die Methode auch statisch machen, so daß du keine Instanz der Klasse erzeugen musst, sondern die Methode direkt über den Klassennamen ansprechen kannst. Allerdings gibt es dann ein paar Restriktionen, die du in Tutorials über statische Methoden oder der MSDN nachlesen kannst.
 
ok, soweit hat alles geklappt.
Danke schoen!

Jetzt hab ich noch 2 weiterfuehrende Fragen:
-Warum kann ich in der Klasse "Response" nicht benutzten?

und warum passiert folgendes:

Wenn ich Button 1 druecke kommt ein Fehler in der Class1.cs:

"System.NullReferenceException: Object reference not set to an instance of an object.
public void write()
Line 20: {
Line 21: TextBox1.Text = "klasse";
Line 22: }

"

Wenn ich Button2 druecke wird der gewollte Text in die Box geschrieben.

die Webseite:
Code:
namespace test
{
public class WebForm1 : System.Web.UI.Page
	{
		protected System.Web.UI.WebControls.Button Button1;
		protected System.Web.UI.WebControls.Button Button2;
		protected System.Web.UI.WebControls.TextBox TextBox1;

		Class1 test = new Class1();
		private void Page_Load(object sender, System.EventArgs e)
		{
			
		}

		
		private void Button1_Click(object sender, System.EventArgs e)
		{
			test.write();
		}

		private void Button2_Click(object sender, System.EventArgs e)
		{
			test.write(TextBox1);
		}
	}
}

Class1.cs:
Code:
public class Class1
	{
		protected System.Web.UI.WebControls.TextBox TextBox1;
			
		public void write()
		{
			TextBox1.Text = "klasse";
		}
		public void write(TextBox box)
		{
			box.Text = "klasse";
		}

		public Class1()
		{
		
		}


danke schoen

cu

RAiner
 
Ganz einfach: Weil es in der WebForm1 die TextBox1 nicht gibt.

Hier müsstest Du das anders lösen:

Class1.cs
Code:
public string write() {
   string returnString = "";
   // Irgendwas tun um den returnString zu füllen
   returnString = "muh";
   return returnString;
}

WebForm1.aspx
Code:
private void Button1_Click(object sender, System.EventArgs e)
{
   TextBox1.Text = test.write();
}

So sollte das funtionieren.

test ist hierbei natürlich wieder deine Instanz der Klasse Class1.
 
Bei Button1_Click beziehst du dich wie schon erwähnt auf eine Instanz (test), die das Objekt TextBox1 nicht kennt. WebForm1 kennt test, test aber nicht WebForm1 und seine Elemente.

In Button2_Click übergibst du eine Referenz (einen Verweis) auf die TextBox und beziehst dich in der Klasse auf diesen Verweis. Somit machst du die TextBox in Button2_Click in der Klasse bekannt.

Deine zweite Variante ist zwar möglich, ist jedoch sehr unübersichtlich und macht deine Klasse weniger dynamisch. Was machst du z.B. wenn du den Text in eine ListBox schreiben willst anstatt eine TextBox ? Du müsstest die Methode überladen.

Die Variante von NorbertEder ist schon wesentlich eleganter. Sie ist dynamisch, der zurückgegebene Text kann allen möglichen Objekten und Eigenschaften zugewiesen werden.
Außerdem beschränkt sich die Methode auf das wesentliche, nämlich den Text zu generieren. Die eigentliche Visualisierung durch Zuweisung zu der TextBox gehört in diesem Fall in die Klasse WebForm1. Die Visualisierung kann zwar in die Klasse (Class1) verschoben werden, in dem Fall ist allerdings die Frage, wofür sie dann noch da ist. Man hätte dann nämlich alles gleich in WebForm1 packen können.
 
alles klar danke schoen
es war mir zwar halbwegs klar, nu is es aber ganz klar

was macht denn das hier dann ueberhaupt aus in class1:

protected System.Web.UI.WebControls.TextBox TextBox1;

weil ohne das kommt ein anderer Fehler, dass er halt TextBox1 nicht gibt in dem Namespace. Und als der Fehler damit weg war, dacht ich, kennt die Klasse nun die TextBox1 auch (falsch gedacht).

Wenn ich nochmal auf die Aufteilung in Klassen zurueck kommen darf(eigentlich hats psychtron ja schon gut beschrieben):
Wie sieht eine sinnvolle Aufteilung aus? Wenn ich z.B. 2 Webseiten hab, eine administriert die Datenbank(edit,delete etc.), die andere Stellt die Namen der Datenbank dar. Die Virsualisierung sollte also in den WebForms ansich stattfinden und der Rest in der Klasse?
Ich hab mal gelesen, man soll allen Code in eine Codedatei schreiben, aber das kam mir sehr komisch vor.
Also mir gehts jetzt allgemein um ein paar Grundsaetze wie man die Klassen einteilt.

danke schone

RAiner
 
Hallo.

In Class1 bräuchtest du diese Zeile damit du von deiner write-Methode eine TextBox Instanz hast,auf welche du Zugreifen kannst. Das protected ist ein Zugriffsmodofizier der bedeutet, dass nur abgeleitete Typen / übergeordnete Typen darauf zugreifen können.
Wichtig beim CodeBehind Model, das man auf Elemente in der aspx-Seite zugreifen kann. Von dort wirst du das auch kopiert habe, und denken das es funktioniert, oder?

Nunja, in deiner Class1 geht das allerdings nicht, da diese keine Page darstellt, und auch keine aspx Seite davon ableitet. Deswegen wird dein TextBox1 in Class1 immer null sein.

MfG,
Alex
 
rainerdam hat gesagt.:
alles klar danke schoen
es war mir zwar halbwegs klar, nu is es aber ganz klar

was macht denn das hier dann ueberhaupt aus in class1:

protected System.Web.UI.WebControls.TextBox TextBox1;

weil ohne das kommt ein anderer Fehler, dass er halt TextBox1 nicht gibt in dem Namespace. Und als der Fehler damit weg war, dacht ich, kennt die Klasse nun die TextBox1 auch (falsch gedacht).

Wenn ich nochmal auf die Aufteilung in Klassen zurueck kommen darf(eigentlich hats psychtron ja schon gut beschrieben):
Wie sieht eine sinnvolle Aufteilung aus? Wenn ich z.B. 2 Webseiten hab, eine administriert die Datenbank(edit,delete etc.), die andere Stellt die Namen der Datenbank dar. Die Virsualisierung sollte also in den WebForms ansich stattfinden und der Rest in der Klasse?
Ich hab mal gelesen, man soll allen Code in eine Codedatei schreiben, aber das kam mir sehr komisch vor.
Also mir gehts jetzt allgemein um ein paar Grundsaetze wie man die Klassen einteilt.

danke schone

RAiner

Eine "sinnvolle" Aufteilung liegt größtenteils in deiner Hand. Eine Klasse ist ja eine abstrakte Beschreibung eines Objektes. In ihr solltest du Methoden und Eigenschaften kapseln, die zu dem Objekt gehören, daß du beschreiben willst.
Angenommen du hättest ein Objekt "Mensch". Diesem würdest du (aus deiner Erfahrung) bestimmte Eigenschaften und Methoden zuteilen, andere wiederum würden zu diesem Objekt nicht passen.
Bei Klassen in Programmiersprachen ist das wiederum etwas anderes. In den Büchern werden meist alle möglichen Haustiere durcherklärt und voneinander abgeleitet, die Progammierrealität ist jedoch deutlich komplexer. Hier hat man einfach die Erfahrungen nicht, wie man am sinnvollsten kapselst. Die Klasse ist dort nichts, unter dem du dir einen konkretes Bild machen kannst oder schon ein konkretes Bild hast, du stehst einfach vor einem Haufen Eigenschaften und Methoden und weißt nicht, wohin damit. Letztendlich gibt es auf deine Frage nach den Grundsätzen nur die oben benannten. Fasse zusammen, was deiner Meinung nach zusammen gehört, so das eine abstrakte Beschreibung eines Objektes entsteht, mit der du etwas anfangen kannst.
Intuitiv lernen kannst du das, indem du auf Fehler bei deiner Einteilung im Laufe der Programmierung stößt und indem du dir andere Klassen anschaust.
Über das Tool WinCV, daß bei Visual Studio mitgeliefert wirst, hast du binnen Sekunden eine Übersicht über alle Methoden und Eigenschaften aller .NET-Klassen. Dort hast du viele Beispiele, wie man kapselt.
Auf einen wichtigen Grundsatz bist du ja schon selbst gestoßen: die Visualisierung gehört auf die Oberfläche und möglichst nicht in die Klasse, weil die Klasse eine andere Aufgabe hat.

Die von dir beschriebene Funktionalität der beiden Webseiten gehört meines Erachtens in eine Klasse. Beide beziehen sich auf deine Datenbank -> Objekt -> Klasse und deren Eigenschaften und Methoden.

Ein Beispiel, an dem ich gerade arbeite: Ich habe eine Klasse, die verschiedene Funktionalitäten zur Verfügung stellt.
Sie wird für zwei vollkommen unterschiedliche Programme genutzt. In ASP.NET nehme ich die Klasse, um Statistiken aus der Datenbank in einem DataGrid darzustellen und die Daten über ein Formular zu filtern. Ebenso wird eine grafische Darstellung generiert.
Das Folgeprogramm wird sich darum drehen, in festen Intervallen Berichte auf Basis der selben Daten wie das ASP.NET-Programm automatisch zu erstellen und diese per Mail zu verschicken. Beide Programm bereiten Daten vollkommen unterschiedlich auf, nutzen jedoch die selbe Klasse um sich die Daten zu holen.
Hätte ich bei der ASP.NET-Seite nur eine Webform an meine Klasse als Parameter zur Visualisierung übergeben, wäre die Klasse für mein zweites Programm nutzlos gewesen.

Und hier kommen wir zu einem weiteren wichtigen Grundsatz von Klassen: Dynamik.
Eine Frage die du dir immer stellen muss ist, was passiert mit meiner Klassen, wenn sich die Umwelt der Klasse ändert ? Passt sich meine Klasse an, wenn sich die Umwelt ändert oder muss ich die Klasse an die Umwelt anpassen (worst-case). Du solltest also Schnittstellen über die Klasse bereitstellen, aber die Klasse möglichst nicht mit der Umwelt verwurzeln.
 

Neue Beiträge

Zurück