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 :

Prise en compte d'événement successif avec WPF


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2008
    Messages : 54
    Points : 98
    Points
    98
    Par défaut Prise en compte d'événement successif avec WPF
    Bonjour, le problème est le suivant.

    Une TextBox avec l'événement TextChanged.

    Dans mon cas, le traitement T de l'événement E associé à la TextBox, dure assez longtemps.
    Si le texte change x fois, j'ais donc les traitement T1, T2, Tx qui s'accumulent et s'exécutent à la suite.
    J'aimerais que le traitement T ne s'exécute que si j'arête de modifier le texte de ma texte box durant un certain temps (et non pas à chaque modification).

    (le traitement en question est une requête LDAP, la saisie est celle d'un samaccountname, et je souhaiterais que la recherche de l'objet ne se fasse que si j'arrête de saisir mon texte plus de 0,5 secondes par exemple.)

    Visual studio community 2013
    .NET 4.5

    cordialement
    Patrick
    Débutant en Dotnet/C# mais programmeur "amateur" de différents langages depuis des lustres.
    J'utilise Visual studio 2010 express et le framework 4.0

    Environnement de travail Windows 7 et 2008.
    Administrateur accro en scripting, essentiellement Powershell.

  2. #2
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 51
    Points
    51
    Par défaut
    tu ne pourrais pas chaque fois que ton tu arrives dans ton textchanged, Lancer un timer de 500ms

    Si le timer est deja lancé, tu stoppe le timer en cours
    et tu en relances un nouveau de 500ms

    à la fin du timer tu fais ton action.

  3. #3
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2008
    Messages : 54
    Points : 98
    Points
    98
    Par défaut
    Citation Envoyé par ChickenJim Voir le message
    tu ne pourrais pas chaque fois que ton tu arrives dans ton textchanged, Lancer un timer de 500ms

    Si le timer est deja lancé, tu stoppe le timer en cours
    et tu en relances un nouveau de 500ms

    à la fin du timer tu fais ton action.
    c'est une bonne idée, je vais essayer ça.
    (le temps de comprendre comment on crée un timer :-) )

    Merci
    Je ferais un retour
    Débutant en Dotnet/C# mais programmeur "amateur" de différents langages depuis des lustres.
    J'utilise Visual studio 2010 express et le framework 4.0

    Environnement de travail Windows 7 et 2008.
    Administrateur accro en scripting, essentiellement Powershell.

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2013
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 93
    Points : 127
    Points
    127
    Par défaut
    Bonsoir,

    Peux-tu donner des détails sur l'action que tu veux faire préciser, peut-être qu'un autre événement serait plus adéquat à ton problème.

  5. #5
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2008
    Messages : 54
    Points : 98
    Points
    98
    Par défaut
    Citation Envoyé par Kangourex Voir le message
    Bonsoir,

    Peux-tu donner des détails sur l'action que tu veux faire préciser, peut-être qu'un autre événement serait plus adéquat à ton problème.
    Oui, il s'agit de verifier les éléments saisis d'un formulaire au fil de l'eau, actuellement chaque modification d'un champ provoque une recherche sur des milliers d'objets, et c'est tres penalisant en cours de frappe.
    Si l'objet existe le champ se color en rouge pour prevenir l'utilisateur.
    Bien sur, je pourrait le faire avec un simple bouton, mais c'est moins interessant.

    Je note qu'il y a 3 timers, le quel choisir selon quel critére, mon code est en WPF ?

    System.Windows.Forms.Timer
    System.Timers.Timer
    System.Threading.Timer

    Mon bouquin sur C# ne propose que la premiére classe mais passe vite sur le sujet.
    Débutant en Dotnet/C# mais programmeur "amateur" de différents langages depuis des lustres.
    J'utilise Visual studio 2010 express et le framework 4.0

    Environnement de travail Windows 7 et 2008.
    Administrateur accro en scripting, essentiellement Powershell.

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2013
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 93
    Points : 127
    Points
    127
    Par défaut
    Alors le mieux à faire c'est quand le texte change, tu émets un laps de temps ou il peut encore changer.

    Par exemple je tape "EAU", Je vais taper "E", "A", "U" donc 3 traitements. Mais si tu émets un laps de temps d'une seconde qu'on puisse la rechanger sans faire de traitement tu pourras taper "EAU" et faire ton traitement après.

    Après tu peux cliquer sur un bouton pour lancer la chose.

    Ou attendre que la souris quitte la textbox (LostFocus).


    Bah déjà :

    - System.Windows.Forms.Timer est un composant winform il déclenche une méthode toutes les X ms, je pense qu'en WPF il est pas intégré ou alors caché la winform (mais ça consomme etc)
    - System.Timers.Timer il fait la même chose mais ne dépend pas d'un winform.
    - System.Threading.Timer je dirai qu'il dépend plus d'un thread à déclecheur de méthode à temps X ms.

    Le Threading.Timer est de plus bas niveau, que les 2 autres. Mais plus on monte en niveau plus y a de contrainte d'utilisation et de condition d'accès.

  7. #7
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2008
    Messages : 54
    Points : 98
    Points
    98
    Par défaut
    Citation Envoyé par Kangourex Voir le message
    Alors le mieux à faire c'est quand le texte change, tu émets un laps de temps ou il peut encore changer.

    Par exemple je tape "EAU", Je vais taper "E", "A", "U" donc 3 traitements. Mais si tu émets un laps de temps d'une seconde qu'on puisse la rechanger sans faire de traitement tu pourras taper "EAU" et faire ton traitement après.

    Après tu peux cliquer sur un bouton pour lancer la chose.

    Ou attendre que la souris quitte la textbox (LostFocus).


    Bah déjà :

    - System.Windows.Forms.Timer est un composant winform il déclenche une méthode toutes les X ms, je pense qu'en WPF il est pas intégré ou alors caché la winform (mais ça consomme etc)
    - System.Timers.Timer il fait la même chose mais ne dépend pas d'un winform.
    - System.Threading.Timer je dirai qu'il dépend plus d'un thread à déclecheur de méthode à temps X ms.

    Le Threading.Timer est de plus bas niveau, que les 2 autres. Mais plus on monte en niveau plus y a de contrainte d'utilisation et de condition d'accès.

    Merci tout le monde
    J'ai fais ça ça marche très bien.
    Pour ceux que ça intéresserait les parties en rouges relatives à ma question.

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    using System;
    using System.Collections.Generic;
    using System.DirectoryServices;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Controls.Primitives;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Forms;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Windows.Threading;
    
    
    namespace NewUser
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
    
            private string login = "login";
            private string pass = "motdepass";
            private string domain = "monDom.com";
            private string pathAD = "/OU=mesUsers,DC=monDom,DC=com";
    
            private DirectoryEntry entry = null;
            private SearchResult result;
            Timer timer0 = new Timer();
    
            public MainWindow()
            {
                InitializeComponent();
                Authenticate();
            }
    
            private DirectoryEntry Authenticate()
            {//crée la connection à l'annuaire
                try { 
                entry = new DirectoryEntry("LDAP://"+domain+pathAD, login, pass);
                }
                catch (Exception)
                {
                    tb1.Text = "Erreur Authentification";
                    tb2.Text = "Erreur Authentification";
                    tb1.Background = Brushes.Red;
                    tb2.Background = Brushes.Red;
                }
                
                return entry;
            }
    
            private void getResult(DirectoryEntry entry, string login)
            {//fait une recherche d'objet dans l'annuaire
                DirectorySearcher search = new DirectorySearcher(entry);
                search.Filter = "(cn=" + login + ")";
                search.PropertiesToLoad.Add("displayname");
                search.PropertiesToLoad.Add("cn");
                result = null;
                result = search.FindOne();
            }
    
            private void disp(DirectoryEntry entry, string login)
            {//Affiche les parametres du compte
                getResult(entry, tb0.Text);
                if (result != null)
                {
                    tb1.Text = (string)result.Properties["displayname"][0];
                    tb2.Text = (string)result.Properties["cn"][0];
                }
                else
                {
                    tb1.Text = "Erreur";
                    tb2.Text = "Erreur";
                }
            }
    
            private void bt0_Click(object sender, RoutedEventArgs e)
            {//gére le click d'affichage du compte
                if (tb0.Text != "")
                {
                    disp(entry,tb0.Text);
                }
            }
    
            private void tb0_TextChanged(object sender, TextChangedEventArgs e)
            {//gérere le lancement et la réinitialisation du timer
                if (tb0.Background == Brushes.Red)
                {
                    dispatcherTimer_Tick(this, e);
                }
                if (tb0.Text != "")
                {
                    if (timer0.Enabled == false)
                    {
                        timer0.Tick += new EventHandler(dispatcherTimer_Tick);
                        timer0.Interval = 800;
                        timer0.Start();
                    }
                    else
                    {
                        timer0.Start();
                    }
                }
            }
    
            private void dispatcherTimer_Tick(object sender, EventArgs e)
            {//gérere la couleur d'arriére plan de tb0
                getResult(entry, tb0.Text);
                if (result != null)
                {
                    tb0.Background = Brushes.Red;
                }
                else
                {
                    tb0.Background = Brushes.White;
                }            
            }
    
        }
    }
    ici le code XAML

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <Window x:Class="NewUser.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="152" Width="525">
        <Grid x:Name="gr0">
            <TextBox x:Name="tb0" Height="22" Margin="10,10,10,0" TextWrapping="Wrap" Text="acc" VerticalAlignment="Top" Grid.Column="1" TextChanged="tb0_TextChanged"/>
            <TextBox x:Name="tb1" Height="22" Margin="10,64,10,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Grid.Column="1"/>
            <TextBox x:Name="tb2" Height="22" Margin="10,91,10,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Grid.Column="1"/>
            <Button x:Name="bt0" Content="Button" HorizontalAlignment="Left" Margin="10,37,0,0" VerticalAlignment="Top" Width="75" RenderTransformOrigin="1.12,1.227" Grid.Column="1" Height="22" Click="bt0_Click"/>
        </Grid>
    </Window>
    Débutant en Dotnet/C# mais programmeur "amateur" de différents langages depuis des lustres.
    J'utilise Visual studio 2010 express et le framework 4.0

    Environnement de travail Windows 7 et 2008.
    Administrateur accro en scripting, essentiellement Powershell.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. prise en compte d'une reduction avec paypal
    Par arckaniann dans le forum Langage
    Réponses: 8
    Dernier message: 17/06/2012, 18h02
  2. Non prise en compte de certaines conditions avec Fonction SI
    Par argaz01 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 14/06/2010, 08h10
  3. ASDOC : pas de prise en compte des évènements
    Par Lorenzo77 dans le forum EDI/Outils
    Réponses: 0
    Dernier message: 01/03/2009, 00h30
  4. Requête avec prise en compte des jours ouvrés
    Par guenfood dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 25/02/2008, 15h36
  5. probleme prise en compte modification avec tomcat4.1
    Par faroun dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 03/05/2006, 20h41

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