Aktive Control herausfinden, wo das Popup-Menu geöffnet wurde

Scrapy

Mitglied
Ich habe in meiner Form 2 TextBoxen, welchen ich das gleiche Popup-Menu zugeordnet habe. Nun möchte ich durch die Auswahl aus dem Popup-Menu bestimmte Textelemente in die aktuell untergeordnete TextBox einfügen.

Wie bekomme ich jetzt aber heraus, auf welcher TextBox der Benutzer das Popup-Menu aktiviert hat? :(

Bedank' mich vorher schon mal für eure Antworten!
 
Beim Aufruf des Context-Menüs wird ein Popup-Event ausgelöst. Hier gibt es die Möglichkeit auf den sender zuzugreifen. Voila. Wobei der sender in diesem Fall ein object ist und du es noch auf eine TextBox casten musst.

So kannst du zb mit
Code:
((TextBox)sender).Name
den Namen der TextBox ausgeben lassen etc.
 
Genauso hatte ich mir das auch gedacht!

Aber ich bekomme folgende Fehlermeldung, wenn ich das Ereignis auslöse:
Eine nicht behandelte Ausnahme des Typs 'System.InvalidCastException' ist in Form1.exe aufgetreten.
Zusätzliche Informationen: Die angegebene Umwandlung ist ungültig.

Ich habe versucht den Sender mit der Form oder dem Control an sich zu casten, wobei letzteres überhaupt nicht funktioniert (logisch).
Ich hab mal das Ereignis herauskopiert:
Code:
private void cmnDatumEinfuegen_Click(object sender, System.EventArgs e)
{
  MessageBox.Show(((System.Windows.Forms.TextBox)sender).Name);
}
Eigentlich würde ich es dann später gerne so abfragen:
Code:
private void cmnDatumEinfuegen_Click(object sender, System.EventArgs e)
{
  if(((System.Windows.Forms.TextBox)sender).Name == "TextBox1")
  {
    TextBox1.Text += "[Datum]";
  }
  else
  {
    TextBox2.Text += "[Datum]";
  }
}
Gibt es eine andere Möglichkeit oder mache ich was falsch? :(
 
Setzt den Cast in einen Try-Block rein, um die Exception zu verhindern, wenn ein anderes Control als eine TextBox das Event auslöst:

Code:
try
{
  TextBox tb = (TextBox)sender;
  if ( tb.Name == "MeineTextbox" )
    MessageBox.Show( "Hurz!" ); // wichtige Dinge tun
}
catch( System.InvalidCastException ex )
{
  // ups, schlechter cast! das war keine TextBox!
}
 
Sorry, war mein Fehler. Du bekommst so natürlich das ContextMenu zurück und musst da das SourceControl abfragen. Das bekommst du so:

Code:
((TextBox)((ContextMenu)sender).SourceControl ).Name)
 
Also so oder so bekomme ich die gleiche Fehlermeldung! :(

@Kachelator:
Sollte ich ein TextBox-Dummy (tb) in der Methode anlegen?
Ich habs 1:1 kopiert und hab die gleiche Fehlermeldung bekommen. Das Event kann doch auch nur von TextBox1 oder TextBox2 aus gestartet werden, warum dann try&catch?

@Norbert Eder
Der Sender stammt doch vom Popup-Menu, warum sollte man den denn dann nochmal casten?
Hat leider auch nicht funktioniert!

Danke nochmal für eure Tipps, ich werde es noch weiter versuchen! :)
 
Scrapy hat gesagt.:
Also so oder so bekomme ich die gleiche Fehlermeldung! :(

@Kachelator:
Sollte ich ein TextBox-Dummy (tb) in der Methode anlegen?
Ich habs 1:1 kopiert und hab die gleiche Fehlermeldung bekommen. Das Event kann doch auch nur von TextBox1 oder TextBox2 aus gestartet werden, warum dann try&catch?

tb wäre ja nur eine lokale Referenz auf eine existierende TextBox. Aber hör lieber auf das, was Norbert schreibt. Ich habe nämlich nicht genau hingelesen, sonst hätte ich mich rausgehalten, da das Problem ja anscheinend ganz woanders liegt. Nichtsdestrotrotz schadet es nicht, einen Cast von object in einen Try-Block zu setzen.
 
Scrapy, das funktioniert so, weil ichs ausprobiert hab.

Du castest den Sender auf ein ContextMenu, weil es vom Typ object daherkommt, ergo hats die Methoden und Properties eines ContextMenu ohne Casten nicht.

Das ContextMenu hat ein Property SourceControl und das gibt dir das Control zurück, welches das ContextMenu "gestartet" hat. Und das kommt auch als object daher und musst du deshalb auf eine TextBox casten.

Also nochmal zum Testen:

Dein ContextMenu hat ein einziges Event Popup. Und in dieses Event fügst du mal folgende Zeilen ein:

Code:
Console.WriteLine(sender.GetType().ToString());
Console.WriteLine( ((TextBox)((ContextMenu)sender).SourceControl ).Name) ;

Wenn du nun bei einer deiner TextBoxen das ContextMenu aufrufst, dann sollte er dir in die Console schreiben, von welcher TextBox das ganze ist.

Hast du das ContextMenu auch noch auf anderen Controls hängen (also nicht nur TextBoxen), dann musst du dir zuerst den Typ ausgeben lassen. Das kannst du mit GetType() machen.
 
Alles klar, war mein Fehler, ich hatte das ganze auch im Click-Ereignis von einem Popup-Menü ausprobiert! - Klar das er hier die Zuordnung so nicht finden kann!

Danke nochmal an euch! :)
 

Neue Beiträge

Zurück