Announcement

Collapse
No announcement yet.

Probleme mit foreach und Controls...

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme mit foreach und Controls...

    Code:
            public void setPermissions() {
                dt.Clear();
                sql.Connect();
                dt = sql.getTable("select tablename, fieldname, readpermission, writepermission from sabongui_userrights where user_id = '"+ this.id +"' and tablename='Documents' order by permission_id");
                sql.closeConnection();
                int i = 0;
                foreach (DataRow zeile in dt.Rows) {
                    string con_name = "cmb_READ_"+""+dt.Rows[i][0]+"_"+dt.Rows[i][1];
                    i++;
                    foreach (Control c in this.Controls) {
                        if (c.Name.Equals(con_name)) {
                            c.Text = dt.Rows[i][2].ToString();
                        }
                    }
                 }
                
            }
    Die Controls werden alle druchlaufen. Die obere ForEach stimm auch. Allerdings komme ich in den inneren IF-Block nicht rein. Die Namen stimmen 100% überein. Equals muss also True ergeben.

    Habt ihr ne Idee ?!

  • #2
    Das Problem solltest du mit debuggen selbst beheben können.

    Unsauber erscheint hier auf den ersten Blick das

    i++;

    mitten in der Schleife.

    So ist

    string con_name = "cmb_READ_"+""+dt.Rows[i][0]+"_"+dt.Rows[i][1];


    die dt.Rows eine andere als

    c.Text = dt.Rows[i][2].ToString();
    Christian

    Comment


    • #3
      Bist du sicher, dass du wirklich auch das gesuchte Control mit durchläufst und das nicht in ein anderes geschachtelt ist? Setze mal einen Breakpoint in der foreach-Schleife (außerhalb des ifs) und gucke, ob dein Control wirklich auftaucht (Maus über "c.Name" halten, falls der nicht angezeigt wird den eventuell vorher einem string zuweisen).

      Wenn es auftaucht, kopiere den Wert von "c.Name" in Notepad und suche im Textfile nach dem Wert von "con_name", den du dir auch kopiert hast. Wenn er den gefunden hat, ist dein Problem komplexer als erwartet.

      Comment


      • #4
        Die Namen stimmen 100% überein
        Sicher? Der Name einer Variablen auf der Form für ein Control ist nicht zwingend der Inhalt der Name Variablen des Controls.

        Und this.Controls enthält nur Controls die direkt auf dem Control(vermutlich eine Form) liegen. Heißt wenn this in deinem Beispiel eine Form ist dann bekommst du nur die Controls die direkt auf der Form liegen. Befinden sich Controls auf einem Panel oder in einer Groupbox werden die von deinem Code übersehen. Du mußt rekursiv durch die Controls Collection iterieren da jedes Control eine eigene Controls Collection haben kann in der dein gesuchtes Control steckt.

        Comment


        • #5
          Code:
          public void setPermissions() {
                      dt.Clear();
                      sql.Connect();
                      dt = sql.getTable("select tablename, fieldname, readpermission, writepermission from sabongui_userrights where user_id = '"+ this.id +"' and tablename='Documents' order by permission_id");
                      sql.closeConnection();
                      foreach (DataRow zeile in dt.Rows) {
                          string con_name = "cmb_READ_"+""+zeile["tablename"]+"_"+zeile["fieldname"];
                          foreach (Control c in this.Controls) {
                              if (c.Name.Equals(con_name)) {
                                  c.Text = zeile["readpermission"].ToString();
                              }
                          }
                          MessageBox.Show(con_name);
                       }
                      
                  }
          So sieht das ganze ohne dem i aus...
          Ergebnis das gleiche, If wird toleriert!

          Comment


          • #6
            Da lag das Problem. Die Controls lagen auf einer TabPage...
            Wie kann ich Controls auf dem gesamtem Form durchsuchen ?!

            Comment


            • #7
              Wie kann ich Controls auf dem gesamtem Form durchsuchen ?!
              Rekursion.

              Entweder du beginnst bei der Form und durchsuscht die Controls der Form, dann die Controls des jeweiligen Controls, ....

              Oder beginnst in einem Controls und durchsucht die Controls und falls keines gefunden wurde eine Ebenen höher (sofern eine Referenz auf das Parent-Control vorhanden ist - sonst die obere MÖglichkeit).

              mfG Gü
              "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

              Comment


              • #8
                Der Find Methode Kann man sagen das sie die Controls rekursiv durchsuchen soll.

                Code:
                this.Controls.Find("meinControlName", true)
                Beim TabPage bin ich mir aber nicht sicher ob die TabPages in der ControlsCollection verwaltet werden. Mußt du ausprobieren.

                Comment


                • #9
                  Vermutlich beides besser als 8 TabPages einzelnt zu durchsuchen...

                  this.Controls.Find("meinControlName", true)
                  "meinControlName" ist jetzt die Form ?!
                  Zuletzt editiert von gfoidl; 14.07.2009, 14:12.

                  Comment


                  • #10
                    Nein der Name des Controls das du suchst.

                    Comment


                    • #11
                      Okay, und das sucht er rekursiv auf dem gesamten "this"...

                      Ich danke euch!

                      /EDIT

                      Es funktioniert auch auf tabPages!

                      Comment

                      Working...
                      X