dotnet-snippets.de
Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1405 | Anzahl registrierter User: 1436 | Besucher online: 67
Hauptmenü
Home
Top Ten
Zufälliger Snippet
Tech-Ed-Gewinnspiel
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Partner von Codezone.de


Member of Microsoft Community Leader/Insider Program (CLIP)

SqlDataSource.FilterExpression auf Bitflag filtern


Autor: Steav
Sprache: C#
Bewertung:
noch nicht bewertet

Anzahl der Aufrufe: 1513
  

Beschreibung:

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


Abgelegt unter: Sql, DataSource, Filter Expression, Bit Flag, field.



C#
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
        [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;
        }  
Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

Steav schrieb am:  05.01.2010 11:18:42

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 11:47:59

Putenz :D das der Brüller des Tags
Steav schrieb am:  05.01.2010 11:55:35

ob das wohl ein freudscher Verschreiber war... :-D


schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.