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