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 :

[C#]Changer le "compare" d'un DataTable


Sujet :

C#

  1. #1
    Membre confirmé Avatar de anitshka
    Inscrit en
    Mai 2004
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 624
    Points : 605
    Points
    605
    Par défaut [C#]Changer le "compare" d'un DataTable
    Bonjour,

    J'ai un petit soucis de gestion de valeur considérée comme identique dans un DataTable.
    Dans mon code j'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        /// <summary>
        /// The table which contains the value column.
        /// </summary>
        private DataTable entriesTable;
     
        /// <summary>
        /// The column which contains all entries.
        /// </summary>
        private DataColumn entriesColumn;
    Cette table lorsque je la spécifie, je demande à ce que les doublons ne soient pas autorisés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private void InitializeComponent()
    {
      this.entriesTable = new DataTable();
      this.entriesColumn = new DataColumn();
      this.entriesColumn.DataType = typeof(string);
      this.entriesColumn.ColumnName = "entries";
      this.entriesColumn.ReadOnly = false;
      this.entriesTable.Columns.Add(this.entriesColumn);
     
      this.entriesColumn.Unique = true;
    }
    Voici la methode pour ajouter un élément dans ma table :

    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
     
    private void AddEntry(string entry)
        {
          DataRow row = this.entriesTable.NewRow();
          row[this.entriesColumn.ColumnName] = entry;
     
          try
          {
            this.entriesTable.Rows.Add(row);
          }
          catch (ConstraintException c)
          {
              /* impossible to add the new row because it break a constraint. */
          }
        }
    Tout fonctionne parfaitement , sauf pour le cas limite qui suit :
    En effet d'un point de vue fonctionnel dans mon application les 2 mots suivants sont considérés comme étant bien différents :
    mot 1:
    prieß
    mot 2:
    Priess
    Or pour ma table ils sont identiques... Ce qui me pose problème car je ne vois que 2 solutions à ce problème :
    La première serait de surcharger mes éléments pour changer la méthode contains de la DataRowCollection associée... ce qui je trouve est assez lourd au final...
    La seconde serait de réimplémenter une méthode contains dans mon code et de tester le contenu de l'entry dans mon AddEntry ... mais j'ai bien peur que ce ne soit pas super optimisé...


    Avez vous d'autres idées ?
    d'avance,

    anne

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Bizarre ça...

    Il me semble qu'en allemand le caractère "ß" est équivalent à "ss". J'ai fait un petit test:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        string a = "prieß";
        string b = "priess";
        Console.WriteLine(a.Equals(b)); // False
        Console.WriteLine(a.Equals(b, StringComparison.CurrentCulture)); // True
        Console.WriteLine(a.Equals(b, StringComparison.Ordinal)); // False
    Donc en gros il faudrait pouvoir forcer le DataTable à utiliser une comparaison ordinale, mais je ne vous aucune propriété qui permette cela... Il y a bien une méthode CheckUnique, mais elle n'est pas virtuelle donc pas moyen de l'overrider

    En tous cas tu peux déjà contrôler le fait que ce soit sensible ou non à la casse (propriété DataTable.CaseSensitive)

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour anitshka,

    il est possible de définir une CultureInfo à ton DataTable en utilisant le propriété Locale de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    entriesTable.Locale = new CultureInfo("de-DE");
    Malheureusement, même avec cette méthode la comparaison ne se fait pas en "Ordinal" (en tout cas dans le test que j'ai fait).

    Il doit surement être possible de créer son propre "CultureInfo" qui fera la comparaison avec les options que tu veux mais à première vue, cela n'a pas l'aire si simple

    Pour contourner le problème tu peux toujours créer une méthode qui vérifiera si la valeur existe déjà en parcourant les row de ton DataTable... attention aux perf

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