Partage
  • Partager sur Facebook
  • Partager sur Twitter

DataGridViewComboBoxCell

DialogResult.NO

Sujet résolu
    4 juillet 2022 à 15:56:41

    Bonjour à tous,

    Je pense qu'il sera plus clair pour moi d'expliquer mon problème sans code pour l'instant:

    voila plusieurs jours que je me débat avec un datagridview dans lequel une de mes colonne, et ce sur chaque ligne, possède un fameux DataGridViewComboBoxCell.

    chaque cellule combobox possède son propre contenu. (il s'agit de noms de fichiers stockés dans un dossier spécifique)

    j'y ai rajouté une ligne "..." permettant à l'utilisateur de rajouter une ligne à la combobox de son choix et donc importer un fichier dans le dossier lié à la cellule.

    chaque ligne étant le nom d'un fichier, l'utilisateur peux :

    - soit importer un fichier existant dont le nom respecte le bon formalisme (Openfiledialog + copy to)

    - soit importer un fichier existant en donnant un nouveau nom de fichier au bon formalisme (Savefiledialog + copy to)

    Tout ceci fonctionne très bien.

    Mon soucis repose sur le dialogresult.NO (autant sur l'open que sur le save)

    Si l'utilisateur annule j'aimerai que la valeur précédente de mon DataGridViewComboBoxCell ne change pas tout simplement...

    Et je n'arrive a rien...

    j'ai un peu fureté avant de venir vous solliciter et j'ai trouvé un event "combobox.enter" qui permet lors du clic sur la petite flèche d'un combobox de récupérer la valeur de tête avant qu'elle ne change (c'est exactement ce que je veux)

    or, pour le DataGridViewComboBoxCell, cet event n'existe pas.

    quelqu'un aurait il une idée pour récupérer la valeur précédente de mon contrôle au moment ou celle ci change ?

    en remerciant par avance toute la communauté qui prendra le temps de lire mon soucis

    une tres bonne fin de journee a tous.

    • Partager sur Facebook
    • Partager sur Twitter

    "Kaizoku oni ore wa naru !"

      4 juillet 2022 à 18:44:49

      tu as un événement CellEnter https://docs.microsoft.com/fr-fr/dotnet/api/system.windows.forms.datagridview.cellenter?view=windowsdesktop-6.0 

      mais peut-être qu'une des autres sera meilleure (j'ai supposé que tu étais en Windows Forms)

      Edit:  sur quel évènement tu appelles tes Dialog ? il faudrait enregistrer la valeur avant à ce moment (peut-être) et donc le remettre si dialogresult.no 

      -
      Edité par umfred 4 juillet 2022 à 19:59:08

      • Partager sur Facebook
      • Partager sur Twitter
        5 juillet 2022 à 10:22:41

        Bonjour,

        Merci pour ta réponse, effectivement j'ai fini par passer par l'event CellClick du datagridview pour récupérer la valeur dans une variable privée de mon form actif. Quant aux dialog je les ouvre sur l'event CellValueChanged que j'ai un peu surchargé avec le CurrentCellDirtyStateChanged mais je n'ai pas su recuperer la valeur qui precede ce changement de value sur ces events la :/

        pour pas que les events s'appellent les uns les autres des que je modifie ma liste j'ai du le remove en debut de traitement et je le remet en sortie de ma fonction recursive qui teste mes formats de nom de fichiers...

        Je n'ai pas trouvé plus simple avec mes connaissances :/

        public Form2()
                {
                    InitializeComponent();
        
                    dgvFileIn.CellValueChanged += dgvFileIn_CellValueChanged;
                    dgvFileIn.CurrentCellDirtyStateChanged += new EventHandler(dgvFileIn_CurrentCellDirtyStateChanged);
                    dgvFileIn.CellClick += DgvFileIn_CellClick;
        
                }
        
                private void DgvFileIn_CellClick(object sender, DataGridViewCellEventArgs e)
                {
                    sFileFromComboBox = dgvFileIn.Rows[e.RowIndex].Cells[2].Value.ToString();
                }
        
                private void dgvFileIn_CurrentCellDirtyStateChanged(object sender, EventArgs e)
                {
                    if (dgvFileIn.IsCurrentCellDirty)
                    {
                        // This fires the cell value changed handler below
                        dgvFileIn.CommitEdit(DataGridViewDataErrorContexts.Commit);
                    }
                }
        
                private void dgvFileIn_CellValueChanged (object sender, DataGridViewCellEventArgs e)
                {
                    DataGridViewComboBoxCell cb = (DataGridViewComboBoxCell)dgvFileIn.Rows[e.RowIndex].Cells[2];
                    string sSelected = cb.Value.ToString();
                    string sTypeLine = dgvFileIn.Rows[e.RowIndex].Cells[0].Value.ToString();
                    string sArgLine = dgvFileIn.Rows[e.RowIndex].Cells[1].Value.ToString();
                    if (!bFirstTime && sSelected != null && sSelected == "...")
                    {
                        dgvFileIn.CellValueChanged -= dgvFileIn_CellValueChanged;
                        NewFileToSave(false, ref sSelected, sArgLine, sTypeLine);
                        if (!cb.Items.Contains(sSelected) && sSelected!="CANCEL")
                        {
                            string[] listFiles = new string[cb.Items.Count + 1];
                            listFiles[0] = sSelected;
                            cb.Items.CopyTo(listFiles, 1);
                            cb.Items.Clear();
                            cb.Items.AddRange(listFiles);
                            dgvFileIn.Rows[e.RowIndex].Cells[2].Value = cb.Items[0];
                        }
                        else if (sSelected=="CANCEL")
                        {
                            dgvFileIn.Rows[e.RowIndex].Cells[2].Value = sFileFromComboBox;
                        }
                        else
                        {
                            dgvFileIn.Rows[e.RowIndex].Cells[2].Value = sSelected;
                        }
                        dgvFileIn.RefreshEdit();
                        dgvFileIn.CellValueChanged += dgvFileIn_CellValueChanged;
                    }
                    FileInfo fileInfo = new FileInfo(Path.GetFullPath(@".\ressources\\" + sArgLine + "\\" + sSelected));
                    dgvFileIn.Rows[e.RowIndex].Cells[3].Value = fileInfo.LastWriteTime.ToString();
                }
        
        private string sFileFromComboBox;


        pardon pour le style bourrin je code un peu moche mais au final ca tourne ^^

        • Partager sur Facebook
        • Partager sur Twitter

        "Kaizoku oni ore wa naru !"

          5 juillet 2022 à 13:03:28

          voir si l'évènement CellValidating n'est pas mieux, on récupère la valeur avant modification via e.FormattedValue

          N'oublie pas de vérifier que tu réagis bien à un clic ou un changement de valeur des cellules concernées (là tu réagis de la même façon quelque soit la colonne modifiée, mais c'est peut-être ce que tu veux faire)

          • Partager sur Facebook
          • Partager sur Twitter

          DataGridViewComboBoxCell

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown