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
Hallo roberto,
du solltest es nicht so machen. public Variablen sind ganz schlecht. Besser ist Kommunikation von 2 Forms .
herbivore
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.
Hallo alf468,
sorry, den Vorschlag mit der static-Variablen finde ich noch schlechter.
herbivore
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
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 ?!
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
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
Es kommt garkeine fehlermeldung. aber mein textBox bleibt immer leer...das mit Property habe ich auch nicht hingekriegt 🙁
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
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.
HAllo herbivore,
ich habe es mal so versucht wie deineCde oben, aber es klappt trotzdem nicht..obwohl MessageBox.Show alles richtig zeigt...
Hallo roberto,
also auch in der zweiten MessageBox alles ok? Dann schreibst du in eine TextBox, die nicht angezeigt wird oder verdeckt ist.
herbivore
@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?
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
@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(......);
}
@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..
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
@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?
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