Announcement

Collapse
No announcement yet.

wieder mal FilterExpression

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

  • wieder mal FilterExpression

    Hallo,
    es will mir nicht gelingen, eine FilterExpression zu bauen, die eine Variable enthält.
    Auf einem Formular befinden sich 20 Radiobuttons, mit denen man ein DataGridView filtern kann. Die FilterExpression hab ich im Tag mitgegeben. Zum Beispiel lautet der Tag eines Radiobuttons
    C6511='X'
    und die DataView für das DGV wird gesteuert über

    Code:
            For Each ctl As Control In Panel1.Controls
                If TypeOf ctl Is RadioButton AndAlso CType(ctl, RadioButton).Checked Then
                    filterExpression = (CStr(ctl.Tag))
                End If
            Next
            dView = New DataView(T745, filterExpression, "C0001", DataViewRowState.CurrentRows)
    So funktioniert das einwandfrei.
    Es sind aber auch Filter erforderlich, die z.B. einen Wert aus einer Textbox verwenden sollen.
    Im Tag steht
    C3101 Like '% & tbName.Text & %'

    Da wird kein Datensatz gefunden.
    Setze ich
    filterExpression = "C3101 Like '%" & tbName.Text & "%'"
    dann klappt es.

    Wenn ich den String im Tag mit Anführungszeichen schreibe
    "C3101 Like '%" & tbName.Text & "%'"
    und im Code dann mit der Maus über den Ausdruck filterExpression fahre, wird mir angezeigt
    """C3101 Like '%"" & tbName.Text & ""%'"""
    aber in der Text-Schnellansicht siehts genau richtig aus:
    "C3101 Like '%" & tbName.Text & "%'"

    Dennoch kommt der Fehler

    System.Data.SyntaxErrorException
    HResult=0x80131920
    Nachricht = Das Token '"' kann an Position 36 nicht interpretiert werden.


    Wäre toll, wenn mir wieder einmal jemand auf die Sprünge helfen könnte. Danke!
    Viele Grüße
    Norbert

  • #2
    "C3101 Like \"%" & tbName.Text & "%\""
    Christian

    Comment


    • #3
      CSTR würde den string auswerten und etwas das wie Variablennamen aussehen durch den Inhalt der Variablen ersetzen? Das glaube ich nicht. Ich vermute mal tbText ist irgendeine TextBox deiner UI. Der Inhalt könnte sich ja später zu jedem Zeitpunkt ändern dann wird sich das DataView nicht automatisch umfiltern wenn das dein Ziel war.

      Wenn einfach der passende Filter zum Zeitpunkt des Erzeugens der DataView gesetzt werden soll musst du zu diesem Zeitpunkt den string zusammenbauen zum Bespiel mit string format.

      Code:
      dView = new DataView(T745, String.Format(CSTR(ctl.Tag), tbName.Text), "C0001", DataViewRowState.CurrentRows)
      im Tag müßte dann sowas stehen wie "C3101 Like '%{0}%'".




      Comment


      • #4
        Vielen Dank! Leider noch nicht gelöst.
        Vorschläge von Christian:

        C3101 Like "%" & tbName.Text & "%"
        Das Token '\' kann an Position 12 nicht interpretiert werden.


        "C3101 Like "%" & tbName.Text & "%""
        Das Token '\' kann an Position 13 nicht interpretiert werden.

        @Ralf:
        Ja tbName ist eine Textbox. Da kann man einen Suchstring eingeben und das Grid filtert danach.
        So ganz verstehe ich nicht, wie Du das meinst. Im Tag muss die Anweisung zum Filtern mit dem String aus der Textbox stehen.
        Im dView = kann ich die Textbox nicht anziehen, da es noch 20 andere Filter gibt. Ich will nicht für jeden einzelnen Radiobutton den Filter hart codieren. Es muss also eine FilterExpression her, die aus dem Tag entnommen wird (siehe meine Schleife im ersten Beitrag).

        filterExpression = "C3101 Like '%" & tbName.Text & "%'"
        funktioniert einwandfrei. Aber wie bekomme ich diese Anweisung in den Tag???



        Comment


        • #5
          Die rechte Seite deiner Zuweisung zu filterExpression ist Code. Es ist kein Text. Zumindest ist es nicht nur Text. Du kannst nicht Code in Tag schreiben und dann hoffen das das ausgewertet wird. In Tag kannst du Text hinterlegen den kannst du quoten wie du willst es wird Text bleiben und nie zu Code werden der zu irgendeinem Zeitpunkt wenn du in aus Tag holst dann auf einmal kompiliert wird. Du kannst ein TextTemplate in Tag hinterlegen so wie von mir oben angedeutet. Und dann Code ausführen der die Platzhalter im TextTemplate durch irgendeinen konkreten Text ersetzt. Das macht in meinem obigen Beispiel dann das string.Format.


          Comment


          • #6
            Danke! Habs kapiert. Wieder viel gelernt. Werde es anders lösen müssen. Geht halt nicht, alle Radiobuttons in einer Schleife über einen Kamm zu scheren. Muss sie einzeln anfassen und zu jedem den Filter extra schreiben. Schade.

            Comment


            • #7
              Du könntest anstatt einen string in Tag abzulegen da eine spezielle Klasse ablegen. Die Klasse sollte den Text enthalten mit Platzhaltern so wie du in im Moment direkt in Tag reinwirfst. Und eine Property mit Referenzen auf die Controls die du später benutzen willst um den Filter zusammenzubauen. Das geht aber nur wenn das Tag befüllen zu einem Zeitpunkt passiert an dem die Controls wie zum Beispiel tbName schon existieren.

              Andere Möglichkeit ist in Tag eine Methode (einen Delegaten) zu hinterlegen der den Code ausführt den du brauchst.

              Ich bin leider Unfähig dir Beispiele in VB zu zeigen. Wenn die C# reicht kann ich das tun.


              Comment


              • #8
                Vielen Dank Ralf.
                Natürlich würde mir C# reichen. Aber das Ganze macht nur Sinn, wenn es einfacher und schneller zu coden ist, als die Methode, die ich Dir gleich schildern werde. Und der Code sollte weniger umfangreich sein als das folgende:

                Ich durchlaufe alle Radiobuttons (20 Stück)
                For Each ctl as control In Panel1.Controls

                und frage in einem Select Case die Namen ab. In jedem Case definiere ich den Filter
                Case "rb1" : FilterExpression = "C3101 Like '%" & tbName.Text & "%'"
                Case "rb2" : FilterExpression = "C6511 = 'X'"

                Das sind 20 Zeilen Code. Aber eigentlich auch nicht, denn es funktionieren ja 15 über Tag (C6511='X') und nur die 5 nicht, wo der Wert aus den Textboxen genommen werden muss.
                Ich kann mir nicht denken, dass es einfacher geht mit einer neuen Klasse oder über einen Delegaten. Aber ich bin unwissend

                Comment


                • #9
                  Habe meinen C# code mal durch ein Decompiler gejagt der das dann als VB.Net ausgespuckt hat

                  Einen Delegaten ins Tag schreiben geht z.B. so

                  Code:
                  radioButton1.Tag = New Func(Of String)(Function() "C3101 Like '%" + tbName.Text + "%'")
                  Den wieder rausholen und ausführen so das der Inhalt von tbName.Text eingefügt wird geht so

                  Code:
                  Dim filterExpression As String = TryCast(Me.radioButton1.Tag, Func(Of String))()
                  In filterExpression steht dann
                  Code:
                  C3101 Like '%WasAuchImmerInDerTextBoxStand%'

                  Comment


                  • #10
                    Das sieht super aus! Wollte jetzt nach 14 Stunden am Rechner eigentlich in die Heia. Aber das muss ich noch ausprobieren ...

                    Comment


                    • #11
                      Leider ...
                      Hab auf der Eigenschaften-Seite in den Tag geschrieben
                      New Func(Of String)(Function() "C3101 Like '%" + tbName.Text + "%'")

                      Muss dann nochmal casten, weil ich ne Schleife mit ctl as RadioButton habe (siehe oben)
                      filterExpression = TryCast(CType(ctl, RadioButton).Tag, Func(Of String))()

                      Und da knallt es:
                      System.NullReferenceException: "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."

                      Übrigens sieht Tag dann beim Debuggen in der Text-Schnellansicht der IntelliSense so aus
                      New Func(Of String)(Function() "C3101 Like '%" + tbName.Text + "%'")

                      Vielleicht müsste ich Deine Anweisung
                      Code:
                      radioButton1.Tag = New Func(Of String)(Function() "C3101 Like '%" + tbName.Text + "%'")
                      in den Programmcode schreiben. Aber dann könnte ich gleich schreiben
                      filterExpression = "....
                      Oder haben die Stunden am Rechner meinen Geist vernebelt?



                      Comment


                      • #12
                        Die Tags musst du schon im Code befüllen. Der Property Editor weiß nur das Tag vom Typ Object ist und wenn du dort was reinschreibst ist das beste was der Property Editor tun kann davon auszugehen das das ein string ist. Und da waren wir schon Text/string hilft dir nicht du brauchst ausführbaren Code. Aber wenn das ursprüngliche Ziel war Tag aus dem PropertyEditor zu befüllen gibt es keinen funktionierenden Weg. Da kannst du LIterale, Konstanten etc. da reinschreiben aber niemals Code.

                        Comment


                        • #13
                          Alles klar. Vielen Dank nochmal für Deine Mühe. Ich liebe Deine Beiträge ...
                          Viele Grüße
                          Norbert

                          Comment

                          Working...
                          X