Feedback

C# - SqlDataSource.FilterExpression auf Bitflag filtern

Veröffentlicht von am 1/5/2010
(2 Bewertungen)
Leider lässt der "abgespeckte" Filtersyntax der SqlDataSource.FilterExpression keine Bitoperationen zu. Deshalb hier mein 'Workaround'.

Filtern könnte man dann bspw. mit:
SqlDataSource.FilterExpression = "Flag IN " +
HoleFlagFilterExpressionListe(typeof(Testflag),(Int32)Testflag.Testa);

Sry wenn das Snippet nicht besonders ordentlich ist, wird auch vermutlich Leute die noch nicht mit Bitflags gearbeitet haben verwirren.... aber wenn jemand mal auf dasselbe Problem stößt ists ein guter Workaround
        [Flags]
        private enum Testflag
        {
            Testa = 0x1,   // 00000001
            Testb = 0x2,   // 00000010
            Testc = 0x4,   // 00000100
            Testd = 0x8,   // 00001000
        }

        public String HoleFlagFilterExpressionListe(Type FlagType, Int32 Value)
        {
            // Zunächst wird der Maximumwert des Flags berrechnet der erreicht wird, wenn ALLE flags 'true' sind
            Int32 MaximumWert = 0;
            Int32 AnzahlFlags = (Enum.GetNames(typeof(UpdateFlag)).Length);
            for (int i = 0; i < AnzahlFlags; i++)
            {
                MaximumWert += Putenziere(2, i);
            }

            // Dann werden die 'möglichen' Werte in einer Schleife berechnet
            String FilterExpressionListe = String.Empty;
            for (int i = 1; i <= MaximumWert; i++)
            {
                if (IstFlagGesetzt(i, Value))
                    FilterExpressionListe += "'" + i.ToString() + "',";
            }
            
            FilterExpressionListe = "(" + FilterExpressionListe.Remove(FilterExpressionListe.Length - 1, 1) + ")";

            return FilterExpressionListe;
        }

        private Int32 Putenziere(Int32 Basis, Int32 Putenz)
        {
            if (Putenz == 0)
                return 1;

            Int32 Ergebnis = Basis;

            for (int i = 0; i < Putenz - 1; i++)
            {
                Ergebnis = Ergebnis * Basis;
            }

            return Ergebnis;
        }

        public Boolean IstFlagGesetzt(Int32 BenutzerRechtFlag_Datenbank, Int32 PruefFlag)
        {
            return (PruefFlag & BenutzerRechtFlag_Datenbank) != 0;
        }  

3 Kommentare zum Snippet

Steav schrieb am 1/5/2010:
Int32 AnzahlFlags = (Enum.GetNames(typeof(UpdateFlag)).Length);

Die Zeile wäre korrekt natürlich:
Int32 AnzahlFlags = (Enum.GetNames(FlagType).Length);

Bekomme eine Exception wenn ich den Code bearbeiten will.
Christopher Kk schrieb am 1/5/2010:
Putenz :D das der Brüller des Tags
Steav schrieb am 1/5/2010:
ob das wohl ein freudscher Verschreiber war... :-D
 

Logge dich ein, um hier zu kommentieren!