2009-04-02 6 views
5

Comment supprimer les éléments sélectionnés de ListBox lorsqu'une source de données lui est affectée en C#?Comment supprimer des éléments sélectionnés de ListBox lorsqu'une source de données lui est affectée en C#?

Lorsque vous essayez de supprimer, a erreur

« collection Items ne peut pas être modifiée lorsque la propriété DataSource est définie. »


Mais lorsque je tente de supprimer l'article de source de données (DataTable),

il thorws erreur "datarow n'est pas dans la collection actuelle de la ligne".

Répondre

9

Trouvez cet élément dans l'objet DataSource et supprimez-le, puis reconnectez le contrôle ListBox.

EDIT:

Voici comment vous supprimez d'un DataTable comme DataSource, quelle que soit la version .NET.

DataRowView rowView = listBox.SelectedItem as DataRowView; 

if (null == rowView) 
{ 
    return; 
} 

dt.Rows.Remove(rowView.Row); 

Je ne l'ai pas essayé autre chose que WinForms DataGridViews, mais je recommande fortement BindingListView, qui est à la fois plus rapide que DataTables/Vues et vous permet de lier la liste générique <T> s comme DataSource.

+0

Mais lorsque je tente de supprimer l'article de source de données (DataTable), il thorws erreur « datarow n'est pas dans la collection actuelle de la ligne ». – Dhana

+0

Est-ce WinForms ou ASP.NET? Quelle version du framework .NET utilisez-vous? –

0

Si la zone de liste a une source de données affecté, vous devez supprimer des éléments de la source de données et rebind puis la zone de liste

0

Vous devez modifier la source de données plutôt que de la collection Items du contrôle. Selon le type de source de données auquel vous vous liez, il y aura différentes choses que vous devrez faire pour que vos mises à jour de l'interface utilisateur. Le meilleur moyen est de trouver une collection qui correspond à vos besoins et implémente IBindingList ou IBindingListView. Ces deux interfaces implémentent même des gestionnaires qui écoutent un événement CollectionChanged et mettent à jour votre interface utilisateur en conséquence.

Si votre collection ne prend pas en charge ces interfaces, vous devrez relier votre source de données à chaque fois que quelqu'un ajoute/supprime un élément.

2

Vous pouvez également utiliser une liste qui implémente IBindingList ou hérite de BindingList. Lorsque des objets sont ajoutés ou supprimés d'une liste de liaison, tous les contrôles liés à celle-ci sont automatiquement avertis de la modification et se mettent à jour en conséquence. Si vous utilisez BindingList et que votre classe implémente également INotifyProperty, toutes les modifications apportées aux propriétés de classe seront également mises à jour automatiquement dans le contrôle de liaison de données. Par exemple, si une colonne d'une grille de données (vue) est liée à une propriété "Nom" et que vous modifiez "Nom" dans la source de données, la grille de données sera automatiquement mise à jour. Si vous ajoutez un nouvel élément à la source de données, la grille de données sera automatiquement mise à jour. La liste de liaison prend également en charge la notification dans l'autre sens. Si un utilisateur édite le champ "Nom" dans une grille de données, l'objet lié sera mis à jour automatiquement. En quittant légèrement le sujet, si vous allez un peu plus loin et implémentez "SupportsSortingCore" et les méthodes associées dans BindingList, vous pouvez ajouter un tri automatique à vos données. Cliquer sur un en-tête columnm triera automatiquement la liste et affichera la flèche de direction de tri de l'en-tête.

0

sa varient simplement, affecter une nouvelle valeur vide à la liste déroulante par exemple ..

Dim ABC As New List (Of String)()

ListBox1.DataSource = ABC

0

mise en œuvre ListBox est mis sur écoute, vous devez créer une nouvelle instance de source de données pour le composant pour qu'il reconnaisse un changement.

Par exemple:

ActivitiesList.DataSource = _activities; 

_activities = new List<Activity>(_activities); 
_activities.Remove((Activity)ActivitiesList.SelectedItem); 

ActivitiesList.DataSource = _activities; 
1

lorsque vous obtenez le message "collection Items ne peut pas être modifié lorsque la propriété DataSource est définie." la définition de la source de données à autre chose, la liste vide ou null n'aide pas lorsque le code initializecomponent n'est pas terminé. Pour éviter cette erreur, il faut faire la modification de la source de données ou de la liste des éléments pendant ou après le chargement du formulaire.

Je sais que cela n'a pas de sens. Cependant, le concepteur de studio visuel va générer du code sous la forme designer.cs ou vb qui ajoutera des éléments à la liste si un code qui change les éléments est trouvé avant la fin des composants d'initialisation

0

Alors que Chris Doggett a posté une solution valide, J'ai rencontré des problèmes en l'utilisant. En utilisant cette méthode, il ne permettait pas à GetChanges (DataRowState.Deleted) de fonctionner correctement.

Pour mieux résoudre mon problème, je devais seulement changer une seule ligne - la dernière ligne.

DataRowView rowView = listBox.SelectedItem as DataRowView; 

if (null == rowView) 
{ 
    return; 
} 

rowView.Row.Delete(); 

Cela a permis à mon appel GetChanges de fonctionner correctement.

0

Cela a fonctionné pour moi

 DataTable temp = (DataTable)lstBlocks.DataSource; 
     temp.Rows.RemoveAt(position); 
Questions connexes