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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 50

    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 : 50

    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

+ 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