Autor Beitrag
MarcinD
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

Windows 7 Ultimate (64Bit)
VS2008 Prof. - C#
BeitragVerfasst: Fr 07.01.11 15:34 
Hallo,

ich möchte alle Controls auf einem Formlar durchlaufen, und bei einigen (Die die Eigenschaft Pflichtfeld haben) prüfen ob ein Text drin ist.
Ist keiner drin, dann wird ein ErrorProvider aktiviert und der Text in dem Steuerelement markiert.
Hier habe ich durch eine bool Variable gesteuert, dass wenn er bei dem ersten Pflichtfeld einen Treffer hat und den Text markieren hatt er beim nächsten nur den ErrorProvider setzten soll, der Focus aber auf den ersten falschen Feld der Tab Reihenfolge stehen bleibt.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
bool Plausi_OK = true;

foreach (Control ctl in this.Controls)
{
   if (ctl is Label == false)
   {
      if (ctl is ks_Steuerelemente.ks_Date_TextBox)
      {
         ks_Steuerelemente.ks_Date_TextBox Feld = (ks_Steuerelemente.ks_Date_TextBox)ctl;
         if (Feld.Pflichtfeld == true)
         {
            if (Feld.IstNull == true)
            {
               this.errProvider.SetError(Feld, Feld.Plausibilitaetstext);
               this.errProvider.SetIconAlignment(Feld, Err_Icon_Position);
               if (Plausi_OK == true)
               {
                  Feld.Focus();
                  Feld.SelectAll();
                  Plausi_OK = false;
               }
            }
         }
      }
   }
}


Das Problem ist aber, dass er die Controls querbeet durchläuft und nicht wie der TabIndesx ist. Wie kann ich das umbiegen?

Gruß und Dank

Martin
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 07.01.11 15:43 
Ich vermute einmal, wenn du den Code für deren Erzeugung aufklappst, werden die in dieser Reihenfolge da drauf sein. ;-)
Also einfach den einmal sortieren...

Für diesen Beitrag haben gedankt: MarcinD
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 07.01.11 15:51 
Die Liste vor dem Iterieren z.B. nach deinem Kriterium sortieren?

ausblenden C#-Quelltext
1:
2:
3:
4:
foreach (var control in this.Controls.OfType<Control>().OrderBy(x => x.TabIndex))
{
  // blah              
}


OfType<T> habe ich nur benutzt um aus der nicht generischen Collection eine generische Liste zu machen. Füllt sich nach Missbrauch an.Vielleicht gibt es da noch was geschickteres.

Für diesen Beitrag haben gedankt: MarcinD
MarcinD Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

Windows 7 Ultimate (64Bit)
VS2008 Prof. - C#
BeitragVerfasst: Fr 07.01.11 16:23 
Danke. Super. Das klappt.

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden C#-Quelltext
1:
.OfType<Control>().OrderBy(x => x.TabIndex))					

.


Muss mit nur nochmal das mit den "generische Liste" anschauen. Da wäre ich nämlich nie im Leben drauf gekommen. Hab auch nach OrderBy bei den Controls gesucht, aber nix gefunden.
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 07.01.11 17:28 
Beim 2.ten Blick auf deinen Code sehe ich gerade das du nur über einen bestimmten Typ in den Controls iterieren(ks_Steuerelemente.ks_Date_TextBox) willst. Da kann man dan OfType<T> gleich sinnvoll bzw. sinnvoller anwenden. OfType ist ja eine Art Filter wenn du also nicht auf Control filterst(und damit alle Controls aus der Collection holst) sondern eben gleich auf deine speziellen Controltyp bekommst du gleich eine typsichere Liste die du nicht mehr prüfen musst und kannst dir einen Großteil deines Codes sparen.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
foreach (var control in this.Controls.OfType<ks_Steuerelemente.ks_Date_TextBox>().OrderBy(x => x.TabIndex))
{
    if ((control.Pflichtfeld == true) && (control.IstNull == true))
    {
        this.errProvider.SetError(control , control .Plausibilitaetstext);
        this.errProvider.SetIconAlignment(control , Err_Icon_Position);
        if (Plausi_OK == true)
        {
            control.Focus();
            control.SelectAll();
            Plausi_OK = false;
        }
    }      
}