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

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2012
    Messages : 21
    Points : 14
    Points
    14
    Par défaut Propriété RowFilter - DataView avec comme filtre la clé primaire d'un autre DataView HELP je désespère... :-(
    Bonjour à tous,

    Je programme une application en 3 couches (données, métier, interface). Dans mon interface, j'inclue un formulaire qui contient 2 DataGridView. Ceux-ci sont connecté à un DataSet. J'ai remonté depuis la couche données 2 DataView: SOUSQUESTION et REPONSE. SOUSQUESTION est lié au DataGridView1 et REPONSE au DataGridView2.

    Mais voilà mon problème. Je souhaite utiliser un filtre (propriété RowFilter sans doute) pour qu'à chaque fois qu'on clique sur une question du DataGridView1, il soit affiché les réponses associées à celle-ci dans le DataGridView2... Je pense qu'il faut utiliser l'ID de mon DataView SOUSQUESTION, mais je ne sais pas comment m'y prendre et quelle est la syntaxe pour utiliser une clé primaire d'une table comme filtre...

    Couche données
    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
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Diagnostics;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Data;
     
    namespace T3_DAL_IDEC
    {
        public partial class DAL_Services : Component
        {
                public DAL_Services()
                {
                    InitializeComponent();
                }
     
                public DAL_Services(IContainer container)
                {
                    container.Add(this);
     
                    InitializeComponent();
                }
     
            #region METHODES
                public DataView ChargerTableQUESTION()
                {
                    this.tbaQUESTION.Fill(this.dstCerPro.QUESTION);     //chargement de la table QUESITON
                    return this.dstCerPro.QUESTION.DefaultView;         //retourne la vue chargée
                }
                public DataView ChargerTableSOUSQUESTION()
                {
                    this.tbaSOUSQUESTION.Fill(this.dstCerPro.SOUSQUESTION);
                    return this.dstCerPro.SOUSQUESTION.DefaultView;
                }
                public DataView ChargerTableREPONSE()
                {
                    this.tbaREPONSE.Fill(this.dstCerPro.REPONSE);
                    return this.dstCerPro.REPONSE.DefaultView;
                }
     
            #endregion
        }
    }

    Couche métier
    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Data;
    using T3_DAL_IDEC;
     
    namespace T2_BLL_IDEC
    {
        public class BLL_Questionnaire
        {
            #region CHAMPS
                //Champ d'instance pour DAL_Services
                private DAL_Services DAL = null;
                //Champ vue de données
                private DataView dtvQUESTION = null;
                private DataView dtvSOUSQUESTION = null;
                private DataView dtvREPONSE = null;
     
     
     
            #endregion
            #region PROPRIETES
                //Mise à disposition de la vue
                public DataView VueQUESTION
                {
                    get
                    {
                        return this.dtvQUESTION;    //retourne la valeur du champ privé, à la lecture de la propriété
                    }
                }
                public DataView VueSOUSQUESTION
                {
                    get
                    {
                        return this.dtvSOUSQUESTION;
                    }
                }
                public DataView VueREPONSE
                {
                    get
                    {
                        return this.dtvREPONSE;
                    }
                }
     
     
     
            #endregion
                public BLL_Questionnaire()
                {
                    this.DAL = new DAL_Services();
                }
            #region METHODES
                //méthode permettant l'affectation de la vue par defaut de la table
                public void ChargerVueQUESTION()
                {
                    //appel de la fonction de chargement de la table QUESTION dans DAL
                    this.dtvQUESTION = this.DAL.ChargerTableQUESTION(); //et affectation de sa vue par défaut au champ privé
                }
                public void ChargerVueSOUSQUESTION()
                {
                    this.dtvSOUSQUESTION = this.DAL.ChargerTableSOUSQUESTION();
                }
                public void ChargerVueREPONSE()
                {
                    this.dtvREPONSE = this.DAL.ChargerTableREPONSE();
                }
     
     
     
            #endregion
        }
    }
    Couche interface
    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
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using T2_BLL_IDEC;
     
    namespace T1_UIL_IDEC
    {
        public partial class frmQuestionnaire : Form
        {
            #region CHAMPS
                //Champ d'instance pour BLL_Questionnaire
                private BLL_Questionnaire QST = null;
     
            #endregion
                public frmQuestionnaire()
                {
                    InitializeComponent();
                    this.QST = new BLL_Questionnaire();
                }
            #region METHODES
                private void ChargementDonnees()
                {
                    //Appel du chargement de la vue dans BLL
                    this.QST.ChargerVueQUESTION();
                    this.QST.ChargerVueSOUSQUESTION();
                    this.QST.ChargerVueREPONSE();
     
                }
                private void LiaisonDonnees()
                {
                    //Liaison des données au BindingSource
                    this.bdsQuestion.DataSource = this.QST.VueQUESTION;
                    this.navQuestions.BindingSource = this.bdsQuestion; //et liaison du bindingsource à la navigation
     
                    //Liaison des données des contrôles
                    this.lblQuestion.DataBindings.Add("Text", this.bdsQuestion, "Que_Libelle");
                    this.dgvSousQuestion.DataSource = this.QST.VueSOUSQUESTION;
                    this.dgvReponse.DataSource = this.QST.VueREPONSE;
     
                }
            #endregion
     
                private void frmQuestionnaire_Load(object sender, EventArgs e)
                {
                    this.ChargementDonnees();
                    this.LiaisonDonnees();
                }
        }
    }
    Dans la couche métier on voit la méthode ChargerVueREPONSE() et je voudrais ajouter un filtrer du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                public void ChargerVueREPONSE()
                {
                    this.dtvREPONSE = this.DAL.ChargerTableREPONSE();
                    this.dtvREPONSE.RowFilter = "ID_SousQuestion";
                }
    Biensûr, ID_SousQuestion ne se trouve pas dans dtvREPONSE, mais dans dtvSOUSQUESTION. Ma question est donc, comment récupérer cet ID ? J'ai beaucoup cherché avant de venir poser ici...

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Ceux-ci sont connecté à un DataSet
    En "intercalant" un BindingSource entre DataTable (ou DataView) et DataGridView, on pourra utiliser la propriété Filter du BindingSource pour afficher un extrait de la DataTable.

    La valeur de la propriété Filter correspond au contenu d'une clause SQL WHERE. Avec la valeur par défaut (Filter=""), on voit toute la DataTable.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2012
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par Graffito Voir le message
    En "intercalant" un BindingSource entre DataTable (ou DataView) et DataGridView, on pourra utiliser la propriété Filter du BindingSource pour afficher un extrait de la DataTable.

    La valeur de la propriété Filter correspond au contenu d'une clause SQL WHERE. Avec la valeur par défaut (Filter=""), on voit toute la DataTable.
    et la syntaxe pour la propriété Filter ? Filter = "ID_SousQuestion" ? enfin quelque chose dans ce genre là ?

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Si les réponses se référent aux questions par une Foreign key "QUESTIONID" (je suppose que c'est le même nom de champ dans les 2 tables), on definira le filtre ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataGridView2.BindingSource.Filter="QUESTIONID="+DataGridView1.CurrentRow.Cells["QUESTIONID"].Value.ToString()
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2012
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    mmmm, je voyais pas ça de cette façon. Je vais essayer. Mais le FK est le même dans les 2 table oui, puisque la relation est n-n et qu'il en résulte une table avec clé primaire composée.

    Je teste et si jamais, je reviens ici. Merci bcp pour l'indice :-)

  6. #6
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    Il faut d'abord corriger ceci:
    - lier les DGV aux BindingSources et non aux Views(les View sont deja liees aux BindingSources)
    Ensuite utiliser:
    -event bindingSource.PositionChanged pour "trapper" le row desire.
    Dans l'event :
    -acceder au DataRowView sous jacent,et recuperer le DataRow du datatable
    -acceder à valeur du champ desire dans le row et convertir en string...et l'injecter dans le filtre sur la view desiree...
    Le tout dans Interface...
    bref code .cs exemple avec 2 tables,2 bindingsources, 2 dgv et 2 labels:
    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
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
     
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
     
    namespace WinFilterTables
    {
        public partial class Form1 : Form
        {
            DataSet dataset = null;
            BindingSource bindingSource1 = null;
            BindingSource bindingSource2 = null;
            DataView view1 = null;
            DataView view2 = null;
            DataTableCollection tables = null;
     
              public Form1()
            {
                InitializeComponent();
     
            }
          //Populate des 2 Tables exemples
            private void button1_Click(object sender, EventArgs e)
            {
                dataset = GetDS();
                tables = dataset.Tables;
     
                //  table Reponse 
                view1 = new DataView(tables[0]);
                bindingSource1 = new BindingSource();
                bindingSource1.DataSource = view1; 
                dataGridView1.DataSource = bindingSource1;
                bindingSource1.PositionChanged += new EventHandler(bindingSource1_PositionChanged);
     
     
                //  table Question 
                view2 = new DataView(tables[1]);
                bindingSource2 = new BindingSource();
                bindingSource2.DataSource = view2;
                dataGridView2.DataSource = bindingSource2;
                bindingSource2.PositionChanged += new EventHandler(bindingSource2_PositionChanged);
     
                //text binde sur table Question
                textBox1.DataBindings.Add(
                    new Binding("Text",
                                  bindingSource2,
                                  "ID_Question",
                                  true,
                                  DataSourceUpdateMode.OnPropertyChanged));
     
                textBox1.TextChanged += new EventHandler(textBox1_TextChanged);
            }
     
            void textBox1_TextChanged(object sender, EventArgs e)
            {
                //throw new NotImplementedException();
            }
            //2 labels qui "pistent" les positions des 2 bindingsources
            private int pos1 = -1;
            void bindingSource1_PositionChanged(object sender, EventArgs e)
            {
                pos1 = bindingSource1.Position;
                label2.Text = pos1.ToString();
            }
     
     
            private int pos2 = -1;
            void bindingSource2_PositionChanged(object sender, EventArgs e)
            {
                pos2 = bindingSource2.Position;
                label2.Text = pos2.ToString();
     
                //DataRowView from view2(question)
                DataRowView drView2 = (DataRowView) view2[bindingSource2.Position];
     
                //row 
                DataRow row = drView2.Row;
                string stringFilter = row[2].ToString();
     
                //filtre sur view1
                view1.RowFilter = "ID_Question ='" + stringFilter + "'";
            }
     
     
     
            //2 tables d'exemple
            private DataSet GetDS()
            {
                DataSet ds = new DataSet();
                DataTable dt = null;
                dt = SetupColumnRows(2);
                ds.Tables.Add(dt);
                dt = SetupColumnRows(3);
                ds.Tables.Add(dt);
                return ds;
            }
     
     
            private DataTable SetupColumnRows(int n)
            {
                DataTable dt = null;
                DataColumn dc =null;
                DataRow dr =null;
     
                if (n==2)
                { 
                    dt=new DataTable("Question");
                    dc = new DataColumn("ID_Question",typeof(string));
                    dc.Unique=true ;
                    dc.Caption="Question";
                    dt.Columns.Add(dc);
                    dc = new DataColumn("LibelleQuestion",typeof(string));
                    dc.Caption="LibelleQuestion";
                    dt.Columns.Add(dc);
     
     
                    dr=dt.NewRow();
                    for (int i = 0; i < 10; i++)
    			    {
                        dr[0] = "Question" + i.ToString();
    			        dr[1]="Libelle"+i.ToString();
                        dt.Rows.Add(dr);
                        dr=dt.NewRow();
    			    }
     
                }
                else if (n == 3)
                {
                    dt = new DataTable("Reponse");
                    dc = new DataColumn("ID_Reponse",typeof(string));
                    dc.Unique=true ;
                    dc.Caption="Reponse";
                    dt.Columns.Add(dc);
                    dc = new DataColumn("LibelleReponse",typeof(string));
                    dc.Caption="LibelleReponse";
                    dt.Columns.Add(dc);
                    dc = new DataColumn("ID_Question", typeof(string));
                    dc.Caption="Question";
                    dt.Columns.Add(dc);
     
                    dr = dt.NewRow();
                    for (int i = 0; i < 10; i++)
    			    {
                        dr[0] = "Reponse"  +i.ToString();
    			        dr[1]="Libelle"+i.ToString();
                        dr[2]="Question"+i.ToString();
                        dt.Rows.Add(dr);
                        dr=dt.NewRow();
    			    }
     
     
     
                }
               return dt;
     
            }
     
        }
    }
    bon code....

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2012
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    Merci MABROUKI pour ces précieuses infos.

    J'ai trouvé un moyen de filtrer mes datagridviews avec l'évènement SelectionChanged du DataGridView. le filtre s'applique au DataGridView dans lequel on fait notre sélection.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                private void dgvQuestion_SelectionChanged(object sender, EventArgs e)
                {
                    this.dtvQUESTIONSOUSQUESTION.RowFilter = "ID_Question = " + dgvQuestion.CurrentRow.Cells["ID_Question"].Value;
                }

    A chaque fois que l'utilisateur sélectionne un enregistrement du DataGridView, les enregistrements correspondants à ce dernier s'afficheront dans le second datagridview...

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Filtre dataview avec Date
    Par Ashireon dans le forum VB.NET
    Réponses: 2
    Dernier message: 10/10/2012, 18h44
  3. [VBA-A]procédure avec comme paramètre une propriété
    Par eultartuffe dans le forum VBA Access
    Réponses: 2
    Dernier message: 24/04/2006, 13h49
  4. Requête avec comme critère de recherche un %
    Par Poussy-Puce dans le forum Langage SQL
    Réponses: 1
    Dernier message: 23/03/2006, 20h15
  5. Modifier la surface primaire (avec un filtre)
    Par cemoi dans le forum DirectX
    Réponses: 56
    Dernier message: 01/01/2004, 20h48

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