Feedback

C# - SqlDataSource.FilterExpression auf Bitflag filtern

Veröffentlicht von am 05.01.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
GFU-Schulungen  [Anzeige]

C# Grundlagen

Die Schulung vermittelt Ihnen die Grundlagen von C# in der Arbeit mit Datentypen sowie bei Klassenbibliotheken. Sie lernen, mit Variablen umzugehen und deren verschiedene Formen zu konvertieren. 

ASP.NET Core - Der Einstieg

In nur 3 Tagen lernen Sie, wie man mit ASP.NET Core und den Technologien MVC, Entity Framework, WebAPI und Razor professionelle Web-Anwendungs-Architekturen aufbaut. Diese Schulung ist der perfekte Einstieg, um datengetriebene und präsentations-orientierte Applikationen auf Basis der ASP.NET Core Plattform zu erstellen.

        [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 05.01.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 05.01.2010:
Putenz :D das der Brüller des Tags
Steav schrieb am 05.01.2010:
ob das wohl ein freudscher Verschreiber war... :-D
 

Logge dich ein, um hier zu kommentieren!