IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Drag & drop entre deux listbox utilisant un binding sur entity


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 50
    Points : 29
    Points
    29
    Par défaut Drag & drop entre deux listbox utilisant un binding sur entity
    Bonjour

    je suis actuellement sur un projet où je souhaiterai réaliser un drag and drop entre deux listbox plutôt que de créer deux boutons "add" et "remove".

    Le souci se pose au niveau du contenu des listboxs. Ces listboxs sont peuplées par des observableCollection provenant d'un entityframework.

    Or quand j'essaye des codes trouvés sur le net il me met l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Opération non valide quand ItemsSource est en cours d'utilisation. Accédez aux éléments et modifiez-les avec ItemsControl.ItemsSource.
    J'ai également une méthode qui me permet de récupérer la donnée mais celle ci m'indique :
    L'instance ObjectContext a été supprimée et ne peut plus être utilisée

    Cela fait un petit moment que je cherche maintenant mais... je bloque. Il y a beaucoup d'exemple sur le drag and drop entre deux listes, mais liées à un entity... cela semble plus rare.
    Xaml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     <ListBox IsSynchronizedWithCurrentItem="True" DataContext="{Binding User,Source={StaticResource Locator}}" Name="ListDesPermissions" Grid.Row="1" Grid.Column="1" DisplayMemberPath="nom" ItemsSource="{Binding UsersRoleDispo}" PreviewMouseLeftButtonDown="ListDesPermissions_PreviewMouseLeftButtonDown"  />
     <ListBox  AllowDrop="True" Name="ListDesPermissionsDispo" Grid.Row="1" Grid.Column="4" DisplayMemberPath="nom" ItemsSource="{Binding Roles}" Drop="ListDesPermissionsDispo_Drop"  />
    C#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    ListBox dragSource = null;
            private void ListDesPermissions_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
            {
                ListBox parent = (ListBox)sender;
                dragSource = parent;
     
                object data = GetDataFromListBox(dragSource, e.GetPosition(parent));
                MessageBox.Show(data.ToString());
                if (data != null)
                {
                    DragDrop.DoDragDrop(parent, data, DragDropEffects.Move);
                }
            }
            private static object GetDataFromListBox(ListBox source, Point point)
            {
                UIElement element = source.InputHitTest(point) as UIElement;
                if (element != null)
                {
                    object data = DependencyProperty.UnsetValue;
                    while (data == DependencyProperty.UnsetValue)
                    {
                        data = source.ItemContainerGenerator.ItemFromContainer(element);
                        if (data == DependencyProperty.UnsetValue)
                        {
                            element = VisualTreeHelper.GetParent(element) as UIElement;
                        }
                        if (element == source)
                        {
                            return null;
                        }
                    }
                    if (data != DependencyProperty.UnsetValue)
                    {
                        return data;
                    }
                }
                return null;
            }
     
            private void ListDesPermissionsDispo_Drop(object sender, DragEventArgs e)
            {
                ListBox parent = (ListBox)sender;
                object data = e.Data.GetData(typeof(string));
                ((IList)dragSource.ItemsSource).Remove(data);
                parent.Items.Add(data);
            }
    Merci de votre aide
    Manu

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 50
    Points : 29
    Points
    29
    Par défaut
    Si j'ai regardé mais pas jusqu'au bout.

    Je ne pense pas que cette vidéo parle de ce que je souhaite faire. Elle indique comment dragger une base de donnée sur une listbox ou alors j'ai vraiment rien compris.
    J'utilise entity pour ma base de donnée. Le but est prendre un élément d'une liste et de le déplacer dans une autre.

  4. #4
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    dans la mesure ou les données sont dans le binding, il faut manuellement enlever l'élement de la liste 1 et l'insérer dans la liste 2.

    Comme les listbox sont bindées, il faut directement modifié la bindingsource en ajoutant, supprimant un élément...

    Après, t'as aussi l'option "brute" genre :

    Tu modifies directement ta base de données et tu fais un update de tes listbox...
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 50
    Points : 29
    Points
    29
    Par défaut
    Merci de ton aide, j'avais finalement trouvé comment faire. Mon souci étant notamment d'aller chercher une méthode dans mon view model. Or cette méthode étant non static... je ne pouvais pas l'utiliser dans le xaml.cs.

    Ce problème est réglé, je peux ajouter dans la deuxième liste mais... je me retrouve avec un souci.
    Avec mon code, l'élément que je dragge correspond à l'item sélectionné, or ce n'est pas forcément celui sur lequel je me suis positionné. Je pensais que ce serait automatique mais non...
    Savez vous comment indiquer que le drag se fait sur l'item sur lequel je suis et non celui qui est sélectionné ?

    D'autant plus que j'ai un autre souci, voulant faire un échange entre les deux listsboxs, j'ai le souci que lorsque je clique pour sélectionner un item... et bien il comprend cela comme un drag and drop... ennuyeux pour en sélectionner un autre.

    Merci de votre aide.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 50
    Points : 29
    Points
    29
    Par défaut survol et SelectedItem
    Re,

    je pense avoir identifié une possible solution à ce problème. Est il possible de changer le selectedItem au moment du survol de la souris ?

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 50
    Points : 29
    Points
    29
    Par défaut
    bonjour,


    j'utilise un textbox dans l'item du listbox pour pouvoir le cliquer mais cela ne résoud pas vraiment le problème. Quelqu'un pourrait il m'aider pour que je puisse cliquer sur un item meme si un drag and drop est disponible ? Peut on l'empecher de faire le drag and drop si on ne bouge pas beaucoup par exemple ?

    Merci d'avance
    manu

Discussions similaires

  1. [Débutant] Drag Drop entre deux ListBox qui contiennent des objets
    Par shaun_the_sheep dans le forum Windows Forms
    Réponses: 2
    Dernier message: 12/10/2012, 17h15
  2. [VBA-E]drag and drop entre deux listbox
    Par Yolak dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 14/06/2012, 14h37
  3. Drag and drop entre deux ListBox
    Par simoinfonet dans le forum Langage
    Réponses: 0
    Dernier message: 18/04/2008, 18h53
  4. Drag and Drop entre deux list view
    Par mkaffel dans le forum Windows Forms
    Réponses: 2
    Dernier message: 02/10/2007, 21h52
  5. [FLASH MX2004] Drag and drop entre deux List
    Par aldo-tlse dans le forum Flash
    Réponses: 15
    Dernier message: 24/09/2005, 01h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo