opérations de bits sur Enum
-
22-08-2019 - |
Question
Je vais avoir quelques problèmes avec les éléments suivants:
- Je veux obtenir la première colonne visible et congelée d'une collection de colonnes.
Je pense que cela va le faire:
DataGridViewColumnCollection dgv = myDataGridView.Columns;
dgv.GetFirstColumn(
DataGridViewElementStates.Visible | DataGridViewElementStates.Frozen);
- Est-il possible de faire un bitmask pour obtenir la première colonne congelée ou visible?
La solution
La mise en œuvre est, autant que je sache, "tous ces" - il utilise:
((this.State & elementState) == elementState);
Ce qui est « tous ». Si vous voulez écrire un « tout de », peut-être ajouter une méthode d'assistance:
(Ajouter le "ce" avant DataGridViewColumnCollection
pour en faire une méthode d'extension C # 3.0 in)
public static DataGridViewColumn GetFirstColumnWithAny(
DataGridViewColumnCollection columns, // optional "this"
DataGridViewElementStates states)
{
foreach (DataGridViewColumn column in columns)
{
if ((column.State & states) != 0) return column;
}
return null;
}
Ou avec LINQ:
return columns.Cast<DataGridViewColumn>()
.FirstOrDefault(col => (col.State & states) != 0);
Autres conseils
Eh bien, bitmasks travaillent habituellement comme ceci:
|
se joint drapeaux vers le haut. &
est le filtrage sous-ensemble de drapeaux à partir d'un jeu de drapeau représentée par un masque binaire. ^
est renversant drapeaux par un masque (au moins en C / C ++).
Pour la première colonne congelée ou visible GetFirstColumn
doit gérer bitmasks façon différente (par exemple GetFirstColumn
pourrait obtenir la première colonne qui correspond à l'un des drapeaux fixés, mais ce n'est pas le cas).