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

VB.NET Discussion :

Saisie utilisateur impossible dans combobox cellule datagridview


Sujet :

VB.NET

  1. #1
    Membre habitué Avatar de anonymousse
    Profil pro
    Inscrit en
    Février 2011
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 130
    Points : 170
    Points
    170
    Par défaut Saisie utilisateur impossible dans combobox cellule datagridview
    Bonjour à tous,

    Je bloque sur le paramétrage d'une combobox dans une datagridview. Je pensais qu'il était possible de permettre à un utilisateur d'entrer une valeur non préalablement chargée dans la liste de la combobox.

    La ligne concernée dans la datagridview n'est pas readonly et la combobox est accessible et correctement chargée, mais lorsque l'on clique dessus aucun curseur n'apparait pour permettre d'entrer un caractère, la touche enter n'a aucun effet non plus.

    Est-ce un fonctionnement normal pour ce type d'utilisation ?

    Merci d'avance pour toute info.
    Mousse

  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
    Est-ce un fonctionnement normal pour ce type d'utilisation ?
    Malheureusement, oui.

    Il faut bidouiller un max pour faire passer une DataGridViewComboBox du mode "DropDownList" au mode "DropDown" .

    Un extrait de code qui marche:
    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
     
        private void EditGridView_ControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
           if (e.Control.GetType() == typeof(DataGridViewComboBoxEditingControl))
           {
             DataGridViewComboBoxEditingControl Cb= (DataGridViewComboBoxEditingControl)e.Control ; 
             Cb.DropDownStyle=ComboBoxStyle.DropDown ;
           }
        }
        private void EditGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
           DataGridView Dgv = (DataGridView) sender;
           if (Dgv.Columns[e.ColumnIndex].GetType() == typeof(DataGridViewComboBoxColumn)) 
           {
             DataGridViewComboBoxColumn DgvCbCol=(DataGridViewComboBoxColumn)Dgv.Columns[e.ColumnIndex] ;
             try 
             { // on rajoute la valeur saisie qaux items du ComboBox
               Object Value = Dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].ParseFormattedValue(e.FormattedValue,DgvCbCol.DefaultCellStyle,null,null) ;       
               if (DgvCbCol != null && Value!=null && e.FormattedValue.ToString()!="" && !DgvCbCol.Items.Contains(e.FormattedValue)) DgvCbCol.Items.Add(Value) ;
     
             }
             catch  
             {
                MessageBox.Show("Invalid value provided for column "+Dgv.Columns[e.ColumnIndex].Name+" :"+e.FormattedValue.ToString()) ;
                e.Cancel=true ;
             }
     
           }
        }
        private void GridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
          DataGridView Dgv = (DataGridView) sender;
          if (e.Exception.Message.ToString().Contains("DataGridViewComboBox")) 
          {
            Dgv.CurrentCell.Value = DBNull.Value ;
          }
          else MessageBox.Show(e.Exception.Message.ToString()) ;
          e.Cancel=true ;
        }
    // Technique pour optimiser la perf en cas de modif minime du DataSource 
              DgvCbCol.ReadOnly=true ;
              ArrayList A = new ArrayList() ;
              for (int i=0;i<Filter_DataTable.Rows.Count;i++) 
                if (Filter_DataTable.Rows[i][DgvCbCol.Index]!=null && Filter_DataTable.Rows[i][DgvCbCol.Index].ToString()!="") 
                  A.Add(Filter_DataTable.Rows[i][DgvCbCol.Index]) ;
              try { A.Sort() ; } catch {} ;
              // use a temporary ComboBoxColumn for performance reason : Adding directly the target items is slow ==> use AddRange
              DataGridViewComboBoxColumn ComboBoxColumn = new DataGridViewComboBoxColumn() ;
              ComboBoxColumn.ValueType  = DgvCbCol.ValueType ;
              if (A.Count>0) ComboBoxColumn.Items.Add(A[0]) ;
              for (int i=1;i<A.Count;i++) if (A[i].ToString()!=A[i-1].ToString()) ComboBoxColumn.Items.Add(A[i]) ;
              if (ComboBoxColumn.ValueType == Type.GetType("System.String")) ComboBoxColumn.Items.Insert(0,"") ;
              DgvCbCol.Items.Clear() ;
              DgvCbCol.Items.AddRange(ComboBoxColumn.Items) ;
              DgvCbCol.ReadOnly=false ;
    Edit : Dans ce code, le DataSource de la Combo est une colonne string du même nom que la DataGridViewComBoxColumn située dans la Table "Filter_DataTable".
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Membre habitué Avatar de anonymousse
    Profil pro
    Inscrit en
    Février 2011
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 130
    Points : 170
    Points
    170
    Par défaut
    Bonjour Graffito,

    C'est malheureusement ce que je craignais, merci pour ta réponse rapide.

    Le temps de terminer un autre bout de code et je vais me replonger dans ce code pour l'essayer.

    encore merci.
    Mousse

  4. #4
    Membre habitué Avatar de anonymousse
    Profil pro
    Inscrit en
    Février 2011
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 130
    Points : 170
    Points
    170
    Par défaut
    Bon, je reviens sur mon problème pour lequel je tente une solution plus simple que j'avais déjà utilisée sur une Listview.
    Je créé une Combobox que je superpose aux cellules Datagridview concernées, en utilisant Hide et Show (avec un positionnement suivant les coordonnées cellules récupérées).

    Sauf que dans le cas de la Datagridview, lorsque j'utilise Show la Combobox n'est pas visible (elle reste sous la Datagridview) !

    Quelqu'un aurait-il une info ?

    mousse
    Mousse

  5. #5
    Membre habitué Avatar de anonymousse
    Profil pro
    Inscrit en
    Février 2011
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 130
    Points : 170
    Points
    170
    Par défaut
    Autant pour moi, il faut utiliser la méthode Control.BringToFront !
    pb résolu
    Mousse

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

Discussions similaires

  1. Keydown dans une cellule datagridview
    Par oami89 dans le forum VB.NET
    Réponses: 6
    Dernier message: 30/03/2011, 09h52
  2. [XL-2003] Comment éviter la saisie de doublon dans une cellule
    Par MichaSarah dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 26/09/2010, 11h01
  3. héberger des contrôles dans des cellules DataGridView Windows Forms
    Par abdallah2007 dans le forum Windows Forms
    Réponses: 0
    Dernier message: 29/07/2009, 19h53
  4. Saisie semi-automatique dans combobox
    Par method_man dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 04/04/2007, 16h11

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