Laden...

Eine Variable lässt sich von einem Windows Form nicht aufrufen

Erstellt von roberto vor 18 Jahren Letzter Beitrag vor 18 Jahren 3.511 Views
R
roberto Themenstarter:in
7 Beiträge seit 2005
vor 18 Jahren
Eine Variable lässt sich von einem Windows Form nicht aufrufen

Hallo,
ich habe folgendes Problem, ich versuche von einem Windows Forms auf eine Variable zu zugreifen. Die Variable ist in andere Klasse definiert.

1.Klasse:

namespace OutlookAddIN
{

public class Connect : Object, Extensibility.IDTExtensibility2
	{

                     public string tester;
public void myInspectors_NewInspector(Microsoft.Office.Interop.Outlook.Inspector Inspector)
		{
			
			try
			{
				object Item = Inspector.CurrentItem;
				Ol._Application appOutlook = new Ol.Application();
				Ol.NameSpace OlNS = appOutlook.GetNamespace("MAPI");
				OlNS.Logon("", null, null, null);
			
				// Check the ItemsType
				if (Item is Ol.ContactItem)
				{

Ol.MAPIFolder contactlist = OlNS.GetDefaultFolder(Ol.OlDefaultFolders.olFolderContacts);

												
			Ol.ContactItem oCt = (Ol.ContactItem) Item;
				
			//get the E-MAil adress							
                                                tester = oCt.Email1Address;
                                                MessageBox.Show(tester);
				
				}
			}						
			catch (System.Exception ex)
			{
			MessageBox.Show (ex.Message);
			}
		}

}

jetzt versuche ich vom Windows Form der Inhalt der Variable "tester" aufzurufen und dieser (E-Mail Adresse) ins TextBox einzufügen:

namespace OutlookAddIN
{
	/// <summary>
	/// Zusammenfassung für Invoke.
	/// </summary>
	public class invoke : System.Windows.Forms.Form
	{
public System.Windows.Forms.TextBox textEMail;


public void invoke_Load(object sender, System.EventArgs e)
		{
			
			Connect test = new Connect();
			textEMail.Text  = test.tester;
			
			
		}

mit dieser Code klappt es nicht, obwohl MessageBox.Show(tester) in der Klasse Connect.cs die E-Mail Adresse anzeigt.

Hat jemand eine Idee?

Danke

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo roberto,

du solltest es nicht so machen. public Variablen sind ganz schlecht. Besser ist Kommunikation von 2 Forms .

herbivore

A
196 Beiträge seit 2005
vor 18 Jahren

Am besten du machst eine statische Variable so hast du auch Zugriff auf die Variable aus einer anderen Klasse. So wie du es jetzt hast wird es nicht gehen. Du kannst nicht von einer Instanz auf Variablen (oder sonstiges ) die nicht mit dieser Instanz erstellt wurden zugreiffen.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo alf468,

sorry, den Vorschlag mit der static-Variablen finde ich noch schlechter.

herbivore

2.082 Beiträge seit 2005
vor 18 Jahren

Mein Vorschlag wäre eine Property in der Klasse zu machen. Eine mit get und set methoden oder nur mit get methode.

Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de

A
196 Beiträge seit 2005
vor 18 Jahren

Original von herbivore
Hallo alf468,

sorry, den Vorschlag mit der static-Variablen finde ich noch schlechter.

herbivore

Ich kann doch aber nicht von der Instanz y auf eine Variable die von Instanz x einen Wert bekommen hat zugreifen. So ist es doch mit statischen Variablen am besten ?!

R
roberto Themenstarter:in
7 Beiträge seit 2005
vor 18 Jahren

Hallo frisch,
ich habe es auch so versucht gehabt aber es klappt auch nicht...

@herbivore&alf468
könntet ihr mir vielleicht code-beispiele zeigen, ich kann irgendwie nicht viel mit euren tips anfangen

danke

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo zusammen,

da habe ich wohl etwas lässig geguckt. Es geht ja gar nicht um zwei Form-Klassen. Ziehe meinen Vorschlag daher zurück. Allerdings bleibe ich dabei, dass public Variablen schlecht sind. Du kannst aber wie von frisch vorgeschlagen, ein Property verwenden.

Ansonsten sollte der Code gehen. Was kommt denn für eine Fehlermeldung?

Hallo alf468,

so ganz verstehe ich deine Argumentation nicht. Man macht ja nicht Variablen static oder nicht, damit man drauf besser zugreifen kann. Man macht eine Variable static, wenn sie zur Klasse und eben nicht zu einer Instanz gehört. Das scheint mir hier nicht der Fall zu sein.

Abgesehen davon sollte der Zugriff hier kein Problem sein, da die Instanz auf deren Variable man zugreifen will, vorhanden ist und die Variable public ist (was sie nicht sein sollte; Property verwenden).

herbivore

R
roberto Themenstarter:in
7 Beiträge seit 2005
vor 18 Jahren

Es kommt garkeine fehlermeldung. aber mein textBox bleibt immer leer...das mit Property habe ich auch nicht hingekriegt 🙁

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo roberto


public String Tester
{
   get { return _strTester; }
}
private String _strTester;

Ansonsten sollte es alles funktionieren, wie es ist. Insbesondere wenn du sagst, dass tester in der MessageBox korrekt angezeigt wird.

Mach doch mal


Connect test = new Connect();
MessageBox.Show(test.tester);

Ansonsten solltest du dir mal den Ablauf im Debugger ansehen.

herbivore

A
196 Beiträge seit 2005
vor 18 Jahren

Oh ich habe das auch etwas falsch gelesen 🙁
Mache einfach folgendes:
In der Klasse Connect eine Eigenschaft hinzufügen

public string getTester
{
get{ return this.tester;}
}

Der Aufruf aus invoke machst du so
Connect test = new Connect();
textEMail.Text = test.Tester;

Wobei dein Fehler darin besteht das die Methode myInspectors_NewInspector gar nicht aufgerufen wird und somit tester auch kein Wert hat.

R
roberto Themenstarter:in
7 Beiträge seit 2005
vor 18 Jahren

HAllo herbivore,
ich habe es mal so versucht wie deineCde oben, aber es klappt trotzdem nicht..obwohl MessageBox.Show alles richtig zeigt...

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo roberto,

also auch in der zweiten MessageBox alles ok? Dann schreibst du in eine TextBox, die nicht angezeigt wird oder verdeckt ist.

herbivore

R
roberto Themenstarter:in
7 Beiträge seit 2005
vor 18 Jahren

@herbivore
nein in der zweiten MessageBox wird auch nichts gezeigt...

@alf468
ich glaube auch, dass es an Aufruf von myInspectors_NewInspector liegt, aber ich weiß nicht wie ich die Methode aufrufe..hast du einen Vorschlag?

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo roberto,

wenn die Methode nicht aufgerufen wird, kann auch die erste MessageBox nicht angezeigt worden sein.

Was ist das Problem daran eine Methode aufzurufen? Ein freundschaftlicher Rat: Du solltest dir erstmal mit einem Buch die Grundlagen aneignen.

herbivore

A
196 Beiträge seit 2005
vor 18 Jahren

@herbivore

Mal angenommen ich brauche in vielen Klassen ein Wert einer Variable. So ist es doch am besten die Variable static zu machen um auch Klassen übergreifend auf die Variable zuzugreifen. Richtig ? 😁

@roberto
DU machst das mit
Connect test = new Connect();
test.myInspectors_NewInspector(......);

Oder direkt in der Konstruktor
public Connect ()
{
this.myInspectors_NewInspector(......);
}

R
roberto Themenstarter:in
7 Beiträge seit 2005
vor 18 Jahren

@herbivore
danke für den Rat! aber da es nicht um einfache Methode, ich ich in jedem Grundlagen Buch finden kann, weil es hier um Add-In für Outlook handelt und in meiner erste Klasse (Connect) habe ja eine Schnittstelle zu Outlook und auch innerhalb der Methode myInspectors_NewInspector sind Parameter die mit Outlook zu tun haben..aberin der zweiten Klasse (Windows Forms) habe ich keinen Zugriff auf Outlook..daher hilft leider kein Grundlagen Buch weiter..

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo roberto,

wenn du innerhalb der Klasse Connect Zugriff auf Outlook hast, dann musst du myInspectors_NewInspector eben aus dieser Klasse heraus aufrufen. Das Leben kann so einfach sein. 🙂 Ich bin z.B. davon ausgegangen, dass sie im Konstruktor aufgerufen wird. Und wie gesagt, wenn sie nicht aufgerufen wird, kommt auch keine MessageBox.

Hallo alf468,

wo du eine Variable brauchst, sollte nicht das Kriterium sein, sondern wo sie (logisch/konzeptuell) hingehört. Wenn du z.B. eine Variable hast, die die Anzahl der zu einer Klasse erzeugten Objekte enhält, dann würde dies z.B. eine statische Variable dieser Klasse sein, weil es eben eine Eigenschaft dieser Klasse ist.

herbivore

R
roberto Themenstarter:in
7 Beiträge seit 2005
vor 18 Jahren

@herbivore
ja habe ich auch getan, natürlich die Methode myInspectors_NewInspector wird innerhalb der Klasse Connect aufgerufen, Also die Methode macht ihren Job schon richtig deswegen klappt auch MessageBox denke ich..Die Frage ist muss ich von der zweiten Klasse (Windows Forms) diese Methode aufrufen um auf den Inhalt von tester zu zugreifen?

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo roberto,

wenn die Methode aufgerufen wird (was man ja an dem erscheinen der MessageBox erkennen kann) und wenn die Methode für die Instanz aufgerufen wird, die du in dem Windows-Forms erzeugst, dann sollte tester gesetzt sein.

Deine Frage gehen schon in Richtung sehr grundlegender Zusammenhänge, so dass ich dir durchaus nochmal ans Herz legen möchte, dir solche Grundlagen durch Bücherstudium anzueignen. Auch wie man Properties definiert und wozu sie nützlich sind, findet sich in allen C#-Büchern.

herbivore