Entwickler-Ecke

WinForms - Controls herausfinden


Csharp-programmierer - Do 11.08.16 19:49
Titel: Controls herausfinden
Hallo,
ich habe eine userControl, die aus vielen Panels bestehen. In jedem einzehlen Panel ist eine PictureBox und ein Label. Nun möchte ich ,dass wenn der Benutzer - egal ob das Panel selber, das Label oder die PictureBox - mit der Maus darüberfährt, das Panel gehighlightet wird, auf welchem sich die Maus befindet. Dafür habe ich alle Labels, alle PictureBoxen und alls Panels mit dem selben MouseEnter Event verdrahtet.

Was muss ich machen, damit das so funktioniert?


Th69 - Do 11.08.16 20:00

Hallo,

in dem 'sender'-Objekt wird dir doch das Control übergeben. Dann brauchst du nur abzufragen, ob es schon selber ein Panel ist, ansonsten einfach den Parent nehmen:

C#-Quelltext
1:
2:
3:
4:
5:
Control c = sender as Control;

Panel highlight = c as Panel;
if (c == null)
    highlight = c.Parent as Panel;

(die erste Zeile kann eigentlich entfallen - ich habe es nur zur Verdeutlichung so hingeschrieben)


Christian S. - Do 11.08.16 20:12

Muss es in Zeile 4 nicht if(highlight == null) heißen?


Th69 - Fr 12.08.16 09:58

Ups, ja natürlich :oops:

Also nochmal:

C#-Quelltext
1:
2:
3:
Panel highlight = sender as Panel;
if (highlight == null)
    highlight = c.Parent as Panel;


Csharp-programmierer - Fr 12.08.16 22:07

Ah ok danke. Es funktioniert :)

Ich habe nun aber noch eine Veränderung vorgenommen. Ich habe ein UserControl in einer DLL erstellt, diese heißt in der DLL UC_ThemeItem. In einer anderen DLL habe ich nun dieses UserControl in den Werkzeugkasten implimentiert, und ein paar auf einem weiteren UserControl hinzugefügt. Nun nummeriert VS die einzelnen UserControls ja automatisch. Auf dem UC, wo nun alle UC's von dem Werkzeugkasten sind, heißen diese nun z.B. uC_ThemeItem1[2, 3].

Nun verdrahte ich alle mit einem KlickEvent:

C#-Quelltext
1:
2:
3:
4:
 MeineDll.UC_ThemeItem item = sender as MeineDll.UC_ThemeItem;
                this.label1.Text = item.label1.Text;
                this.richTextBox1.Text = "Success";
                this.pictureBox1.Image = item.pictureBox1.Image;


Nun bekomme ich aber eine NullReferenceException, was daran liegt, dass item vom Wert null ist, aber welches UC muss ich in der ersten Zeile instanzieren?


Ralf Jansen - Fr 12.08.16 23:10

Versuche deine Fragen auseinander zuhalten. Neue Frage neuer Thread.

Zitat:
Nun nummeriert VS die einzelnen UserControls ja automatisch.


Der Klassenname ist immer der gleiche wenn du ein Control im Designer auf eine Form wirfst generiert dir Visual Studio eine Variable die einen eindeutigen Namen hat. Die ist aber a.) nicht wirklich nötig und b.) kannst du die beliebig umbenennen solange der Name eindeutig ist (es kann keine 2 Variablen mit gleichem Namen im gleichen Scope geben). In deinem Event ist der Variablenname aber völlig egal die Variable wird ja nicht benutzt.

Zitat:
dass item vom Wert null ist, aber welches UC muss ich in der ersten Zeile instanzieren?


Dort wird nix instanziiert. Der as Operator castet die Instanz (die hier sender heißt) nur auf einen anderen Typ (hier MeineDll.UC_ThemeItem) wenn den die Instanz auch von diesem Typ ist bzw. diesem Typ zuweisbar ist. Wenn item null ist heißt das sender war nicht vom Typ UC_ThemeItem. Vermutlich hast du nicht den Click Event des UserControls verdrahtet sondern irgendeinen anderen. Möglicherweise von irgendeinem Control das auf deinem UserControl liegt.

Der Namespace in deiner anderen Assembly heißt MeineDll? Das wäre unschön. Ein Namespace ist was anderes als eine Assembly. Eine Assembly kann viele Namespaces enthalten und ein Namespace kann in verschiedenen Assembly zu Hause sein. Namespace und Assemblies sind zwei verschiedene Konzepte.


Csharp-programmierer - Sa 13.08.16 10:04

Vielen Dank. Ich habe mir den sender mal als String ausgegeben und es war eine PictureBox. Aber ich habe die UserControls angeklickt und bin dann auf das ClickEvent gegangen. Ich brauche nämlich unbedingt den Typ UC_ThemeItem.


Csharp-programmierer - Sa 13.08.16 10:12

Okay ich hab nun selber eine Lösung. Ich habe alle Controls diese UserControls mit dem ClickEvent verdrahtet, eine delegierte Methode und Event hinzugefügt. Und beim Klicken einer dieser Elemente wird dann das Event gefeuert. So funktioniert es :)