Autor Beitrag
Csharp-programmierer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Do 11.08.16 19:49 
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?

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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:
ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 11.08.16 20:12 
Muss es in Zeile 4 nicht if(highlight == null) heißen?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 12.08.16 09:58 
Ups, ja natürlich :oops:

Also nochmal:
ausblenden C#-Quelltext
1:
2:
3:
Panel highlight = sender as Panel;
if (highlight == null)
    highlight = c.Parent as Panel;
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: 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:
ausblenden 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?

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: 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.

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: 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 :)

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein