Hallo,
Der Titel ist nicht sehr genau, aber ich wüsste jetzt keine bessere Beschreibung der Problematik.
Ich versuche es mal so genau wie möglich zu erklären:
Mein Vorhaben
Ich verwende DevExpress-Komponenten und generiere die MenuItems eines PopupMenu zur Laufzeit.
Dabei gebe ich den Item-Komponenten einen EventHandler für das Click-Event mit.
Generell habe ich das alles bereits umgesetzt und es funktioniert auch grundsätzlich.
Die Grundlage
Das Generieren eines Item und Zuweisen des EventHandlers führe ich innerhalb einer Helper-Klasse auf diese Weise durch:
[highlight=csharp]
// Create_DXMenuItem aus DevExpressHelper-Klasse:
public DevExpress.Utils.Menu.DXMenuItem Create_DXMenuItem( String sCaption = "DXMenuItem_Template", String sValue = "" ) {
DevExpress.Utils.Menu.DXMenuItem dxitem = new DevExpress.Utils.Menu.DXMenuItem( sCaption );
dxitem.Click += delegate( object sender, EventArgs e ) {
this.ChangeLanguage( sender, e, sValue );
};
}
// ChangeLanguage aus DevExpressHelper-Klasse
private void ChangeLanguage( object Sender, EventArgs e, String s ) {
MessageBox.Show( s );
}
[/highlight]
Mit dieser Konstellation funktioniert alles, wie es soll. Für jeden Menüpunkt, den ich anklicke wird der korrekte Wert in einer MessageBox angezeigt.
Jetzt benötige ich aber innerhalb der Methode ChangeLanguage die Daten einer public-Property, der über einen Konstruktor ein externes Objekt zugewiesen wird.
In der gesamten DevExpressHelper-Klasse habe ich alle Informationen dieses Objektes zur Verfügung, nur nicht in der ChangeLanguage()-Methode.
Eine Eigenschaft des Objektes ist bspw. wieder ein Objekt, das die Zeilen einer Sicht verwaltet.
Und genau darauf kann ich nun nicht mehr zugreifen, wenn ich bspw. die Methode so schreibe:
[highlight=csharp]// ChangeLanguage aus DevExpressHelper-Klasse
private void ChangeLanguage( object Sender, EventArgs e, String s ) {
MessageBox.Show( this.InfoDaten.Zeilen[1].Felder("feld").ToString() );
}[/highlight]
bekomme ich einen NULL-Verweis um die Ohren. Das gilt für alle Vorhaben, die mit dem Objekt this.InfoDaten.Zeilen zu tun haben!
An jeder anderen Stelle innerhalb der Klasse ist der Zugriff kein Problem.
Auch andere Parameter/Eigenschaften sind kein Problem:
[highlight=csharp]// ChangeLanguage aus DevExpressHelper-Klasse
private void ChangeLanguage( object Sender, EventArgs e, String s ) {
MessageBox.Show( this.InfoDaten.AnzahlZeilen.ToString() );
}[/highlight]funktioniert ohne Fehler.
Ich kann mir jetzt nicht erklären, warum ich auf das Zeilen-Objekt nicht mehr zugreifen kann?!
Vielleicht hat jemand ne Ahnung, was das sein könnte bzw. hat auch eine andere Vorgehensweise für mich?
Ich benötige das eigentlich nur, weil ich dem EventHandler einen Paramater mitgeben muß und soweit mir bekannt ist, geht das nur über delegates?!
Danke für Tipps, Hilfen und Anregungen.
Falls die Infos zu dürr sind, einfach nachfragen, ich wollte hier nur nicht zu viel externen Kram reinbringen, der nichts damit zu tun hat.
Danke und Gruß
Arne
Der Titel ist nicht sehr genau, aber ich wüsste jetzt keine bessere Beschreibung der Problematik.
Ich versuche es mal so genau wie möglich zu erklären:
Mein Vorhaben
Ich verwende DevExpress-Komponenten und generiere die MenuItems eines PopupMenu zur Laufzeit.
Dabei gebe ich den Item-Komponenten einen EventHandler für das Click-Event mit.
Generell habe ich das alles bereits umgesetzt und es funktioniert auch grundsätzlich.
Die Grundlage
Das Generieren eines Item und Zuweisen des EventHandlers führe ich innerhalb einer Helper-Klasse auf diese Weise durch:
[highlight=csharp]
// Create_DXMenuItem aus DevExpressHelper-Klasse:
public DevExpress.Utils.Menu.DXMenuItem Create_DXMenuItem( String sCaption = "DXMenuItem_Template", String sValue = "" ) {
DevExpress.Utils.Menu.DXMenuItem dxitem = new DevExpress.Utils.Menu.DXMenuItem( sCaption );
dxitem.Click += delegate( object sender, EventArgs e ) {
this.ChangeLanguage( sender, e, sValue );
};
}
// ChangeLanguage aus DevExpressHelper-Klasse
private void ChangeLanguage( object Sender, EventArgs e, String s ) {
MessageBox.Show( s );
}
[/highlight]
Mit dieser Konstellation funktioniert alles, wie es soll. Für jeden Menüpunkt, den ich anklicke wird der korrekte Wert in einer MessageBox angezeigt.
Jetzt benötige ich aber innerhalb der Methode ChangeLanguage die Daten einer public-Property, der über einen Konstruktor ein externes Objekt zugewiesen wird.
In der gesamten DevExpressHelper-Klasse habe ich alle Informationen dieses Objektes zur Verfügung, nur nicht in der ChangeLanguage()-Methode.
Eine Eigenschaft des Objektes ist bspw. wieder ein Objekt, das die Zeilen einer Sicht verwaltet.
Und genau darauf kann ich nun nicht mehr zugreifen, wenn ich bspw. die Methode so schreibe:
[highlight=csharp]// ChangeLanguage aus DevExpressHelper-Klasse
private void ChangeLanguage( object Sender, EventArgs e, String s ) {
MessageBox.Show( this.InfoDaten.Zeilen[1].Felder("feld").ToString() );
}[/highlight]
bekomme ich einen NULL-Verweis um die Ohren. Das gilt für alle Vorhaben, die mit dem Objekt this.InfoDaten.Zeilen zu tun haben!
An jeder anderen Stelle innerhalb der Klasse ist der Zugriff kein Problem.
Auch andere Parameter/Eigenschaften sind kein Problem:
[highlight=csharp]// ChangeLanguage aus DevExpressHelper-Klasse
private void ChangeLanguage( object Sender, EventArgs e, String s ) {
MessageBox.Show( this.InfoDaten.AnzahlZeilen.ToString() );
}[/highlight]funktioniert ohne Fehler.
Ich kann mir jetzt nicht erklären, warum ich auf das Zeilen-Objekt nicht mehr zugreifen kann?!
Vielleicht hat jemand ne Ahnung, was das sein könnte bzw. hat auch eine andere Vorgehensweise für mich?
Ich benötige das eigentlich nur, weil ich dem EventHandler einen Paramater mitgeben muß und soweit mir bekannt ist, geht das nur über delegates?!
Danke für Tipps, Hilfen und Anregungen.
Falls die Infos zu dürr sind, einfach nachfragen, ich wollte hier nur nicht zu viel externen Kram reinbringen, der nichts damit zu tun hat.
Danke und Gruß
Arne
Comment