L'événement ListChanged d'une IBindingList déclenche un type ListChangedType.ItemDeleted lorsque des éléments sont supprimés, peut-être par un utilisateur qui supprime une ligne dans un contrôle DataGrid lié à la liste. Le problème est que le NewIndex dans la liste n'est pas valide dans cet événement, il a été supprimé et l'élément qui a été supprimé n'est pas disponible. Il devrait y avoir un événement ItemDeleting, mais je doute qu'ils puissent le réparer.dotnet: ListChangedType.ItemDeleted est inutile?
Répondre
Oui, c'est assez ennuyeux, mais il y a une solution de contournement facile. Je crée une classe BindingListBase<T>
que j'utilise pour toutes mes listes au lieu d'utiliser un BindingList<T>
normal. Parce que ma classe hérite du BindingList<T>
, j'ai accès à tous ses membres protégés, y compris la méthode RemovedItem
.
Ceci me permet de décrocher lorsqu'un élément est retiré. Vous pouvez faire ce que je fais et avoir une liste mRemovedItems à laquelle j'ajoute toujours des objets, ou soulevez votre propre événement 'ItemRemoved'.
Voir mon exemple de code ci-dessous:
Public MustInherit Class BindingListBase(Of T)
Inherits BindingList(Of T)
Protected mRemovedItems As New List(Of T)
Protected Overrides Sub ClearItems()
MyBase.ClearItems()
mRemovedItems.Clear()
End Sub
Protected Overrides Sub RemoveItem(ByVal index As Integer)
Dim item As T = MyBase.Item(index)
MyBase.RemoveItem(index)
mRemovedItems.Add(item)
End Sub
Public ReadOnly Property RemovedItems as List(Of T)
Get
Return mRemovedItems
End Get
End Property
End Class
Ce n'est pas vraiment prévu pour cela. NewIndex
est l'index où se trouvait l'élément lors de sa suppression, et il est utile que les contrôles liés puissent localiser leur élément d'affichage associé dans leurs propres listes et le supprimer. Quel est le cas d'utilisation que vous voulez activer avec un ItemDeleting
?
je l'ai fait quelque chose de semblable à ce que Adam a fait Valpied, à savoir mis en œuvre ma propre classe avec un ListChanging événement gestionnaire. Cela me permet de travailler avec l'élément qui est sur le point d'être retiré de la liste avant qu'il ne le fasse réellement. En réponse à la question de Sunlight concernant le cas d'utilisation ... entre autres choses, je l'utilise pour supprimer les gestionnaires d'événements qui ont été mis sur l'élément contenu quand il a été mis dans la liste. Mes éléments de données contiennent un niveau de gravité d'erreur, déterminé lors de la validation, et les éléments de l'interface utilisateur graphique, ils sont liés pour afficher cette gravité d'erreur en tant que couleur d'arrière-plan. Lorsque le niveau de gravité des erreurs de l'élément de données change, l'élément GUI doit être mis à jour. Je dois donc placer un gestionnaire d'événement HighestSeverityChanged sur l'élément de données lorsqu'il est affiché (seul ou dans le cadre d'une liste affichée), et j'ai besoin de supprimer ce gestionnaire d'événements lorsque l'élément de l'interface graphique n'est pas lié élément de données.
Voici ma version d'une classe BindingList qui implémente un événement itemRemoved, plutôt que de garder une liste secondaire des éléments supprimés
public class ItemRemovedEventArgs : EventArgs
{
public Object Item { get; set; }
public ItemRemovedEventArgs(Object item)
{
this.Item = item;
}
}
public delegate void ItemRmoveEventHandler(Object sender, ItemRemovedEventArgs e);
public class BindingListRedux<T> : BindingList<T>
{
public BindingListRedux() : base() { }
public BindingListRedux(IList<T> list) : base(list) { }
public event ItemRmoveEventHandler ItemRemoved;
protected void OnItemRemoved(ItemRemovedEventArgs e)
{
if (ItemRemoved != null)
{
ItemRemoved(this, e);
}
}
protected override void RemoveItem(int index)
{
Object item = base[index];
base.RemoveItem(index);
this.OnItemRemoved(new ItemRemovedEventArgs(item));
}
}
- 1. UIPageControl est-il inutile?
- 2. Le chiffrement de web.config est-il inutile?
- 3. dotnet fuscator
- 4. Est-ce que Terracotta fait du JMS une couche inutile?
- 5. SQL dans dotNET
- 6. DotNet Oracle ORM
- 7. Quelle est la meilleure suite de composants Dotnet?
- 8. Quel algorithme compatible FIPS est le meilleur dans dotNet 2.0?
- 9. requiredfieldvalidater sur updatepan dans dotnet
- 10. comment intégrer dotnet dans embarqué?
- 11. Verrouillage et multi-thread dans dotNet
- 12. version DotNet de Windows Scripting Host
- 13. Comment bloquer un site programatically utilisant DotNet
- 14. Stratégie de rake, implémentation de DotNet
- 15. Quel est le plus mauvais: un singleton inutile ou un objet de Dieu?
- 16. .net 3.5 Profil du client. Complètement inutile? Est-ce que je manque quelque chose?
- 17. Comment développer un serveur proxy avec DotNet?
- 18. Élimination de la sortie de configuration inutile de log4j
- 19. Besoin de savoir si un framework dotnet est installé sur l'ordinateur client
- 20. Propriété par défaut pour le contrôle utilisateur dotNet Interop
- 21. CSharp/DotNet: Sérialisation, Génériques et classes de base
- 22. Problèmes lors de l'utilisation de openid-selector/dotnet openid
- 23. Pourquoi dotnet 1.1 ne peut-il pas tomber après ArrayList.GetRange?
- 24. compact framework DotNet 3.5 sp1 détecter la résolution de l'appareil
- 25. Le rapport de crash et de pile du programme IPhone montré par le compilateur est totalement inutile!
- 26. Mentionner l'élément TAG HTML devant une classe ou ID (bonne ou une pratique inutile CSS?)
- 27. Insertion de null inutile dans KeyedCollection <TKey, TItem> .Contains (TKey)
- 28. Quelle est la meilleure façon de se connecter à un service Web DotNet à partir de Java?
- 29. Suppression du titre d'en-tête inutile dans PHPBB comme "Page d'index" ou "View Topic"
- 30. Obtenir les résultats de la page dotnet dans la page asp classique