Autor Beitrag
DerC#ler
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 06.02.09 16:02 
Hallo !

Ich möchte meinen Start hier im Forum gleich mal mit einer Frage beginnen. Ich weiß garnicht so richtig, wie ich Euch das ganze beschreiben soll, also fang ich einfach mal an:
Der Inhalt eines Labels wird bestimmt und mit einem anderen Verglichen. Abhängig davon werden zur Laufzeit andere Objekte ein- und ausgeblendet. Dabei tritt manchmal folgendes Phänomen auf:

Ein anderes Label wird immer, genau so wie andere Komponenten, zuverlässig ausgeblendet, wenn die entsprechende Bedingung erfüllt ist.
Das besagte (ausgeblendete) Label liegt auf einer PictureBox, deren Bild bei der gleichen Bedingung geändert wird. Das Ganze wiederum in einer GroupBox, die deaktiviert wird. Innerhalb der GroupBox liegt des weiteren noch ein Label, ein Button und eine weitere PictureBox, die ausgeblendet, bzw. deaktiviert werden.
Bis hier hin kein Problem. Das ganze erfüllt den Zweck, dass die Nichtverfügbarkeit eines Gerätes angezeigt werden soll.

Wenn jetzt die Bedingung eintritt, dass alles wieder angezeigt werden soll, so wird die GroupBox wieder aktiviert, der darin enthaltene Button ist verfügbar, das separate Label kommt auch wieder. Die PictureBox, die als Hintergrund für 2 Labels dient, wechselt ihr Bild so, wie sie es soll.
Die beiden Labels, die darüber liegen, werden jedoch nicht wieder angezeigt, obwohl Visible = true, die zweite PictureBox, die vorher ausgeblendet wurde, wird auch nicht mehr angezeigt, obwohl Visible=true.

Nun ist es aber so, dass das es funtioniert, wenn ich das hier quasi gezielt ausprobiere. Das mache ich, indem ich mir zu Testzwecken einfach eine Checkbox eingebaut habe, mit der ich den bestimmten Text erzwingen kann. In "echt" funktionierts aber leider nicht. Wenn die Ausblenden-Bedingung eintritt, dann wird ausgeblendet, bei der Einblenden-Bedingung tritt oben genannter Effekt auf.


Ich hoffe, dass irgendwer sich hier vorstellen kann, was ich will und mir dabei mal helfen könnte.

Vielen Dank im Voraus.

PS: All zu viel Ahnung hab ich nicht davon, also setzt bitte nicht alles als "Das muss man doch wissen!" voraus.



der entsprechende Code dazu:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
if (label101.Text == "ausblenden")
            {
                groupBox14.Enabled = false;
                pictureBox20.Image = Nano.Properties.Resources.Bild_inaktiv;
                label102.Visible = false;
                label88.Visible = false;
                pictureBox32.Visible = false;
            }
            else
            {
                groupBox14.Enabled = true;
                pictureBox20.Image = Nano.Properties.Resources.Bild_aktiv;
                label102.Visible = true;
                label88.Visible = true;
                pictureBox32.Visible = true;
            }


Zuletzt bearbeitet von DerC#ler am Fr 06.02.09 16:51, insgesamt 1-mal bearbeitet
bakachan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: Fr 06.02.09 16:27 
Ich bin mir jetzt nicht wirklich sicher aber kann es sein das die vermissten controls einfach von anderen verdeckt sind?

Ich würds mit .BringToFront() oder ähnlichen funktionen mal ausprobieren
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Fr 06.02.09 16:27 
Hallo und :welcome:

Bitte ändere in der Problembeschreibung "ComboBox" in "GroupBox", das verwirrt doch sehr. Dazu einfach den ersten Beitrag mit dem "Schere-Button" aktivieren. Bei der Gelegenheit kannst Du auch den Code-Auszug kennzeichnen: Text markieren, "Bereiche" aktivieren, C# auswählen, Plus-Button drücken. Du wirst mir sicher zustimmen, dass das besser lesbar ist.

Ich könnte mir nur vorstellen, dass die Reihenfolge der Befehle mit der Einbindung der Controls nicht zusammenpasst. Sind alle genannten Controls in der GroupBox enthalten? Dann sollte es genügen, die GroupBox unsichtbar zu machen (aber das willst Du vielleicht gar nicht) und wieder einzublenden.

Vielleicht solltest Du nachschauen (in der Designer.cs) und ggf. hier angeben, bei welchen Controls this.Xxx.Controls.Add(label102) steht.

Gruß Jürgen

PS. Solche Namen wie label102 und groupBox14 gehören verboten. Da weißt in spätestens 14 Tagen auch Du nicht mehr, was damit gemeint ist. Sprechende Bezeichner sind gewünscht!
DerC#ler Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 06.02.09 16:59 
Sorry wegen der Bezeichnungen, aber das hat sich nunmal alles so ergeben ....

Alle Elemente befinden sich innerhalb der GroupBox, das Problem ist nur, dass die PictureBoxen nicht grau werden, wenn ich die GroupBox deaktiviere. Das ergibt insgesamt kein schönes Bild, deswegen mach ich das so umständlich. Wenn man einen Button mit einem Bild als Inhalt deaktiviert, so wird dieser ja auch grau, und genau diesen Effekt will ich bei der PictureBox, über der die Labels liegen, erzielen.

Mit dem .BringToFront() wird es wahrscheinlich nicht funktionieren, denn die zweite, alleinstehene PictureBox wird ja auch nicht mehr angezeigt, obwohl nichts drüber liegt.
Ich hab übrigens mal noch etwas probiert:

Nach dem Befehl label102.visible = true; habe ich mal label102.Text = "test"; angefügt. Beim Debuggen wird mir aber als Inhalt "" angezeigt. Ist das vielleicht noch ein Hinweis darauf ?
PerryRhodan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 34


C# (VS 2005 + 2008), .NET 2.0 + 3.5 (inkl. WPF, WCF)
BeitragVerfasst: Fr 06.02.09 17:49 
Hallo,

ich blick zwar nicht ganz durch Dein Problem durch, aber guck Dir doch bitte mal das EnabledChanged-Event der GroupBox an. Über die Controls-Auflistung kannst Du über alle ChildControls der GroupBox iterieren.

Damit sollte Dein Problem einfach, schnell und effektiv gelöst werden können.

Grüße
PerryRhodan

_________________
C# im IRC: QuakeNet, Channel: #dotNet.de
DerC#ler Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Sa 07.02.09 12:03 
Ich hab jetzt nochmal in Ruhe darüber nachgedacht und eigentlich könnte man das Problem viel einfacher beschreiben:

Ich deaktiviere eine GroupBox. Da sich eine darin enthaltene PictureBox nicht deaktivieren lässt, blende ich sie aus.
Wenn ich nun die GroupBox wieder aktiviere und versuche, die PictureBox wieder einzublenden, dann sieht man sie trotzdem nicht - manchmal.
Das gleiche trifft auf zwei Labels zu, die sich auch innerhalb der GroupBox gefinden.

@Perry: Kannst Du mir mal ein kleines Beispiel schreiben ? Ich weiß leider nicht so genau, wie ich das umsetzen soll.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Sa 07.02.09 12:32 
Hallo,

PerryRhodan hat es vermutlich etwa so gemeint:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
void MyGroupBox_EnabledChanged(object sender, EventArgs e) {
   GroupBox box = sender as GroupBox;
   //  Sicherheitsprüfung:
   if (box != null) {    
      foreach(Control ctrl in box.Controls) {
         if (ctrl is PictureBox)
            ctrl.Visible = box.Enabled;
         else
            ctrl.Enabled = box.Enabled;
      }
   }
}

Bei diesem Verfahren wird der aktuelle Wert von GroupBox.Enabled (true oder false) auf alle darunterliegenden Controls übertragen. Bei der PictureBox wird stattdessen Visible geändert. (Laut SDK-Doku/MSDN kann auch PictureBox.Enabled festgesetzt werden; aber es ist möglich, dass davon nichts zu sehen ist.)

Eigentlich sollte die Zuordnung von Enabled automatisch erfolgen, sodass nur der if-Zweig für die PictureBox nötig ist.

Du musst dann nur noch in Deiner Eingangsprüfung festlegen:
ausblenden C#-Quelltext
1:
                groupBox14.Enabled = label101.Text != "ausblenden";					

Dabei umgehst Du auch das (grausame) Problem mit den unmöglichen Namen in der GroupBox.

Vielleicht hilft das jetzt weiter. Jürgen
Lucien81
Hält's aus hier
Beiträge: 4

WinXP,Win2003,Vista,Win2000,Linux (SLES), Open Suse
C# (VS 2008), T-SQL(SSME), PLSQL (SQLDEveloper)Oracle), Perl und ShellSkript
BeitragVerfasst: Di 10.02.09 01:39 
Kann es evtl sein das du dein Programm irgendetwas weiterarbeiten lässt und deshalb einfach nicht dazu kommt die Elemente neu zu zeichnen?


Vielleicht hilft ja

ausblenden C#-Quelltext
1:
Groupbox1.Invalidate();					

Weiter.
Dann gehst du auf jeden Fall sicher das der Bereich neu gezeichnet wird.
Natürlich nach dem Einblenden bzw. Ausblenden.

_________________
Verdammt! Wie hiess die Funktion noch mal? Ah....
(Wenn man nur soviel behalten würde wie man jeden Tag neu lernt)