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

Windows Forms Discussion :

DatagridView et "jointure" de 2 dataTable


Sujet :

Windows Forms

  1. #1
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 19
    Par défaut DatagridView et "jointure" de 2 dataTable
    Bonjour à tous,

    voilà, j'ai un petit problème qui doit être tout simple, mais les datatable, bindings etc restent encore un peu obscures pour moi.

    J'ai donc une datagridview qui pour l'instant m'affiche 1 colonne de code, representant des objets, et 1 colonne de droits qu'on a dessus.

    ca, ca vient de ma datatable1.

    Dans ma datatable2, j'ai une liste de nom d'objets, et leur code.


    donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    datatable1         datatable2
     
    13 | R,W,U         03  | Folder
    05 | W             05  | Table
    03 | R,D           13  | File
    13 | D
    05 | R,U
    Le but est donc d'afficher dans ma datagridview, 1 colonne avec le nom des objets, et 1 colonne avec les droits.

    Je suppose qu'il y a un moyen facile?

    Je n'ai pas acces aux storedprocedure qui remplissent ces datatbles, donc je ne sais pas faire de changement au niveau des requetes, sinon ce serait trop simple :p

    Merci beaucoup

    belote

  2. #2
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    391
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Décembre 2005
    Messages : 391
    Par défaut
    il faut que tu le fasse a la main je crois

  3. #3
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par belote Voir le message
    Je suppose qu'il y a un moyen facile?
    Ben non, il n'y a pas, et il n'y a pas vraiment de raison d'avoir.
    Quand on veut une jointure, on la traite au niveau du SGBD, il n'y a pas de raison de l'effectuer a postériori, une fois les DataSet chargés.

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 346
    Par défaut
    Bonjour,

    tu peux utiliser une DataTable dans laquelle tu fusionnes tes deux DataTable avec la commande Merge.

    Pour plus d'explications,

    http://msdn2.microsoft.com/fr-fr/lib...ge(VS.80).aspx

    Bye

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    On ne voit pas bien le rapport entre un merge et un Join.

  6. #6
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    391
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Décembre 2005
    Messages : 391
    Par défaut
    utilise ca

    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
     
        ''' <summary>
        ''' retourne une table avec la jointure faite entre les 2 tables passés en parametre
        ''' </summary>
        ''' <param name="Table1"></param>
        ''' <param name="Table2"></param>
        ''' <param name="fields">les champs seront separés par un ; </param>
        ''' <param name="errorMessage"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function GetJoin(ByRef Table1 As DataTable, ByRef Table2 As DataTable, ByVal fields As String, ByRef errorMessage As String) As DataTable
            Try
                Dim Field_1 As String = fields.Split(";")(0)
                Dim Field_2 As String = fields.Split(";")(1)
     
                Dim returnDT As DataTable = New DataTable()
                'on recopie les colonnes dans la table de sortie
                For Each col As DataColumn In Table1.Columns
                    If Not returnDT.Columns.Contains(col.ColumnName) Then returnDT.Columns.Add(col.ColumnName, col.DataType)
                Next
                For Each col As DataColumn In Table2.Columns
                    If Not returnDT.Columns.Contains(col.ColumnName) Then returnDT.Columns.Add(col.ColumnName, col.DataType)
                Next
     
                Dim jointure As String = String.Empty
                If Table1.Columns(Field_1).DataType Is System.Type.GetType("System.String") Then
                    jointure = Field_2 & " = '{0}'"
                Else
                    jointure = Field_2 & " = {0}"
                End If
     
     
                Dim newRow As DataRow = Nothing
                'pour toutes les lignes de la table 1
                For Each row As DataRow In Table1.Rows
                    'je fais la joiture sur la table 2 et j en recupere les lignes
                    Dim rows() As DataRow = Table2.Select(String.Format(jointure, row(Field_1)))
                    For Each row2 As DataRow In rows
                        newRow = returnDT.NewRow()
                        'je recopie les donné de la table1
                        For Each col As DataColumn In Table1.Columns
                            newRow(col.ColumnName) = row(col.ColumnName)
                        Next
                        'je recopie les donné de la table2
                        For Each col As DataColumn In Table2.Columns
                            newRow(col.ColumnName) = row2(col.ColumnName)
                        Next
                        returnDT.Rows.Add(newRow)
                    Next
                Next
     
                Return returnDT
            Catch ex As Exception
                Console.WriteLine(ex.ToString())
                errorMessage = ex.Message
                Return Nothing
            End Try
        End Function

  7. #7
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 346
    Par défaut
    On ne voit pas bien le rapport entre un merge et un Join.
    Je suis d'accord sur le principe avec ce que tu disais précédemment, normalement la jointure doit être traité au niveau du SGBD.
    Néanmoins, pour ce qu'il souhaite faire, il peut utiliser DataTable.Merge.
    Voici un exemple qui va vous le confirmer:

    Soit une DataTable parente appelé tableParent et une DataTable enfante appelé tableChild. tableParent doit posséder une clé primaire. Une colonne avec le même nom que la colonne clé primaire de la table parente doit être présente dans la table enfant.
    tableParent et tableChild possède 5 lignes.
    Si tableChild est fusionné à tableParent, la table nouvellement obtenue possède les colonnes de tableParent, les colonnes de tableEnfant et 5 lignes.

    Vous pouvez utiliser le code ci-dessous tel quel dans une application console.
    Code c# : 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
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    using System;
    using System.Data;
     
    public class MainTestMergeDt
    {
      static DataTable tableParent;
      static DataTable tableChild;
     
      public static void Main()
      {
        MakeDataTables();
     
        Console.WriteLine("Programme terminé.");
        Console.ReadLine();
      }
     
      private static void MakeDataTables()
      {
          // Run all of the functions. 
          MakeParentTable();
          MakeChildTable();
          MakeDataTableMerged();
      }
     
      private static void MakeParentTable()
      {
          // Create a new DataTable.
          tableParent = new DataTable("parentTable");
          // Declare variables for DataColumn and DataRow objects.
          DataColumn column1;
          DataRow row;
     
          // Create new DataColumn, set DataType, 
          // ColumnName and add to DataTable.    
          column1 = new DataColumn();
          column1.DataType = System.Type.GetType("System.Int32");
          column1.ColumnName = "ParentID";
          column1.ReadOnly = true;
          column1.Unique = false;
          // Add the Column to the DataColumnCollection.
          tableParent.Columns.Add(column1);
     
          // Create second column.
          column1 = new DataColumn();
          column1.DataType = System.Type.GetType("System.String");
          column1.ColumnName = "ParentItem";
          column1.AutoIncrement = false;
          column1.Caption = "ParentItem";
          column1.ReadOnly = false;
          column1.Unique = false;
          // Add the column to the table.
          tableParent.Columns.Add(column1);
     
          //dataSet = new DataSet();
          //dataSet.Tables.Add(tableParent);
     
          // Make the ID column the primary key column.
          DataColumn[] PrimaryKeyColumns = new DataColumn[1];
          PrimaryKeyColumns[0] = tableParent.Columns["ParentID"];
          tableParent.PrimaryKey = PrimaryKeyColumns;
     
          // Create three new DataRow objects and add 
          // them to the DataTable
          for (int i = 0; i<= 5; i++)
          {
              row = tableParent.NewRow();
              row["ParentID"] = i;
              row["ParentItem"] = "ParentItem " + i;
              tableParent.Rows.Add(row);
          }
      }
     
      private static void MakeChildTable()
      {
          // Create a new DataTable.
          tableChild = new DataTable("childTable");
          DataColumn column2;
          DataRow row;
     
          // Create first column and add to the DataTable.
          column2 = new DataColumn();
          column2.DataType= System.Type.GetType("System.Int32");
          column2.ColumnName = "ChildID";
          column2.AutoIncrement = true;
          column2.Caption = "ID";
          column2.ReadOnly = true;
          column2.Unique = true;
     
          // Add the column to the DataColumnCollection.
          tableChild.Columns.Add(column2);
     
          // Create second column.
          column2 = new DataColumn();
          column2.DataType= System.Type.GetType("System.String");
          column2.ColumnName = "ChildItem";
          column2.AutoIncrement = false;
          column2.Caption = "ChildItem";
          column2.ReadOnly = false;
          column2.Unique = false;
          tableChild.Columns.Add(column2);
     
          // Create third column.
          column2 = new DataColumn();
          column2.DataType= System.Type.GetType("System.Int32");
          column2.ColumnName = "ParentID";
          column2.AutoIncrement = false;
          column2.Caption = "ParentID";
          column2.ReadOnly = false;
          column2.Unique = false;
          tableChild.Columns.Add(column2);
     
          //dataSet.Tables.Add(tableChild);
     
          // Create three sets of DataRow objects, 
          // five rows each, and add to DataTable.
          for(int i = 0; i <= 5; i ++)
          {
              row = tableChild.NewRow();
              row["childID"] = i;
              row["ChildItem"] = "Item " + i;
              row["ParentID"] = i ;
              tableChild.Rows.Add(row);
          }
     
      }
     
      private static void MakeDataTableMerged()
      {
        tableParent.Merge(tableChild, false, MissingSchemaAction.Add);
     
          Console.WriteLine(tableParent.TableName);
          foreach (DataRow r in tableParent.Rows)
          {
            foreach (DataColumn col in tableParent.Columns)
            {
              Console.Write("{0}: {1}, ", col.ColumnName, r[col.ColumnName]);
            }
            Console.WriteLine();
          }
      }
     
    }

    Bye

  8. #8
    Membre éprouvé

    Homme Profil pro
    kiné passionné de dev
    Inscrit en
    Mars 2006
    Messages
    1 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : kiné passionné de dev

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 570
    Billets dans le blog
    1
    Par défaut
    Bouarf, vous vous prenez la tete pour rien, celà peut etre resolu avec une simple procédure select dans la base de donnée.

    tiens, voilà un p'tit select, pour celà il te faut une meme base de donnée avec deux tables, en clair, ce que tu as... Pour ton select, tu fais comme ça:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select u.type,d.droit from datatable1 u, datatable2 d where u.numero = d.numero
    --u comme "un" et d comme "deux", si quelqu'un se pose la question

    cf:http://sqlpro.developpez.com/cours/sqlaz/jointures/

    Vous pouvez remercier SQLPro!

  9. #9
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    391
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Décembre 2005
    Messages : 391
    Par défaut
    oui bien sur avec une requete, mais si les datatables sont chargees depuis un fichier XML ca peut etre utile

  10. #10
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par Poulain Voir le message
    Bouarf, vous vous prenez la tete pour rien, celà peut etre resolu avec une simple procédure select dans la base de donnée.
    Sauf que ce n'était pas du tout la question (que tu n'as visiblement pas lue): il demandait comment faire la jointure a postériori, une fois les DataTables chargées, pas comment faire un Join (ça, je suppose qu'il sait le faire).

  11. #11
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 19
    Par défaut
    Merci tout le monde pour vos réponses!

    Poulain, je sais faire un join, et tu ne sais pas à quel point j'aimerai avoir accès aux dbs... mais non, je dois faire une extension dans un programme existant, et je ne peux pas faire de select moi-meme, j'ai droit à ce qu'on me donne, cad des datatable déjà remplie par des select.

    dietrich, je vais essayer ça cette apres-midi!!
    Mais ça m'a l'air d'être pile poil ce que je cherchais à faire!

    Merci

    je vous donne le feedback au plus vite

  12. #12
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 19
    Par défaut
    Et bien voilà, j'ai adapté un peu, mais ton code est exactement ce que je cherchais!

    un grand merci dietrich!

    Et maintenant je connais la méthode select sur une table, et moi qui faisait ça à la main avant

    merci merci tout le monde!

  13. #13
    Membre éprouvé

    Homme Profil pro
    kiné passionné de dev
    Inscrit en
    Mars 2006
    Messages
    1 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : kiné passionné de dev

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 570
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Sauf que ce n'était pas du tout la question (que tu n'as visiblement pas lue): il demandait comment faire la jointure a postériori, une fois les DataTables chargées, pas comment faire un Join (ça, je suppose qu'il sait le faire).
    En j'ai vraiment mal lut, c'était pourtant clair dans son post...

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

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