none
Insérer icône erreur dans cellules datagridview RRS feed

  • Discussion générale

  • Bonjour à tous,

    J'essaye depuis quelques temps d'insérer l'icône d'erreur dans des cellules de mon datagridview.

    J'ai essayé avec l'errorProvider et avec le setErrorText (propriété des cellules) mais en vain. J'ai l'impression que cela vient de la façon dont je remplis mon tableau :

    J'ai une comboBox au début de chaque colonne. Pour une colonne donnée, je "choisis" un élément de la comboBox et fais appel à l’événement DataGridView_CellValueChanged(Object, sender). Cet évènement remplit le reste des cellules ( de la colonne donnée), à l'aide d'un switch sur un enum (décrivant le type de valeurs). Note : Le choix dans la combobox a été fait de telle sorte que la "cellule combobox" n'a pas forcément perdu le focus avant de faire appel à DataGridView_CellValueChanged(Object, sender), c'est à dire avant de remplir le reste de la colonne.

    Parmi les tests effectués :

    1 : Avec l'errorProvider :  je créée la méthode suivante :

    void error(int i, int j) 
    { 
         System::Windows::Forms::Control^ test = gcnew System::Windows::Forms::Control("text"); 
        this->DataGridView[i,j]->Value = test;
        this->errorProvider1->SetError(test, "testSetError"); 
    } 
    2 : Dans la méthode Datagridview_CellValueChanged(), au niveau de mon switch, sur un des cas, je fais appel à error(e->ColumnIndex, indRow)


    Résultat : un message s’affiche dans toutes les cellules concernées, mais je ne vois pas la valeur de la cellule, ni l’icône d’erreur. Le message est "System.Windows.Forms.Control.Text".

    1 : Avec le propriété setErroText. Afin de l'utiliser, il faut apparemment que la cellule qui va contenir l'icône soit en mode édition. J'utilise donc l'évènenement CellValidating(Object, sender) :

    System::Void CellValidating(System::Object^  sender, System::Windows::Forms::DataGridViewCellValidatingEventArgs^  e) 
    {
          if (this->DataGridView->Visible)
          {
           this->DataGridView->Rows[e->RowIndex]->Cells[e->ColumnIndex]->ErrorText = "Error";
           }
    }
    2 : Je fais en sorte que ma cellule soit bien en mode édition lorsque je la remplis. Avant le switch sur les types de valeurs, je mets  :
    this->DataGridView->CurrentCell = this->DataGridView[e->ColumnIndex, index];
    this->DataGridView->BeginEdit(false); 
    System::Windows::Forms::Control^ cellCtrl = this->DataGridView->EditingControl;
    this->DataGridView[e->ColumnIndex, index]->ErrorText = nullptr; 
                                                   
    Résultat : j’ai des icônes d’erreur un peu ou ça veut, mais toujours sur les mêmes lignes, et si j’édite une ligne, un nouvel icône apparait (selon la ligne). Ici, je ne teste pas les cellules voulues, j'essaye juste d’avoir un icône partout.

    Quelqu'un saurait-il comment je peux me sortir de là s'il vous plaît?

    Merci d'avance pour votre aide,

    Rionms.






    • Modifié Rionms mercredi 7 août 2013 15:12
    • Type modifié Aurel Bera vendredi 16 août 2013 04:28 Discussion
    mardi 6 août 2013 13:17

Toutes les réponses

  • Bonjour

    Normalement ce code doit fonctionner si TablePollutants c'est de type DataGridView. 

    System::Void CellValidating(System::Object^  sender, System::Windows::Forms::DataGridViewCellValidatingEventArgs^  e)
    {
         
    if (this->DataGridView->Visible)
         
    {
          
    this->TablePollutants->Rows[e->RowIndex]->Cells[e->ColumnIndex]->ErrorText = "Error";
          
    }
    }

    Comment vous avez définies DataGridView et TablePollutants?

    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mercredi 7 août 2013 08:57
  • Bonjour, et merci de votre réponse.

    En fait, TablePollutants et DataGridView sont les mêmes tableaux, désolée. Et donc ce tableau est bien de type datagridview. Et en faisant avec CellValidating, je n'ai que des icônes d'erreur un peu où ça veut, mais toujours sur les mêmes lignes.

    J'ai ajouté un datagridview à mon formulaire, ai changé le nom, les propriétés, etc. Il n'est pas lié avec un DataSource ou autre. Je le remplis colonne par colonne en fonction de mes choix de combobox qui se trouvent dans la première ligne. Je ne sais pas si ça répond à votre question.

    De plus, j'utilise l'évènement suivant pour que le remplissage des colonnes soit plus rapide et que l'utilisateur n'ait pas à double cliquer dans la combo avant de valider le choix (ou que la cellule combo perde le focus).

    System::Void Form_Quali::CurrentCellDirtyStateChanged(System::Object^ sender, EventArgs^ e)
    {
        this->Datagridview = (DataGridView^)sender;
        
        if (Datagridview ->CurrentCell->RowIndex == 0)
        {
            if (Datagridview ->IsCurrentCellDirty)
            {
                Datagridview->CommitEdit(DataGridViewDataErrorContexts::Commit);
            }
        }    
    }

    Je ne sais pas si je vous ai apporté d'autres éléments. N'hésitez pas à me redemander s'il vous manque des informations pour m'aider.

    Merci encore.

    Rionms.



    • Modifié Rionms mercredi 7 août 2013 15:11
    mercredi 7 août 2013 15:11
  • Bonjour de nouveau

    J'ai fait un petit teste avec un tableau (liée a un DataSet) et ça fonctionne bien.

    Je pense aussi que le problème est liée avec comment vous remplissez le DataGridView.

    Pouvez vous detailer

    Et en faisant avec CellValidating, je n'ai que des icônes d'erreur un peu où ça veut, mais toujours sur les mêmes lignes.

    Si j'ai bien compris, on ne récupère pas le bon index de la ligne, donc on doit essayer de récupérer d'une autre manière.

    Merci!

    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    jeudi 8 août 2013 05:14
  • Re bonjour,

    Pour remplir le tableau, c'est un peu long à expliquer. Je dois le remplir avec des données préalablement lues dans un shapefile et sauvées dans un objet GroupData. Il y a plusieurs objets de types GroupData sauvés à partir du shapefile. GroupData contient un groupe d'objets Data. Data contient un statut (sous forme d'enum), une valeur et un "nom de code".

    Dans mon datagridview, il y a des lignes qui servent de titres et qui ne contiennent pas de données (hormis un titre). Je ne remplis donc pas toutes les lignes, mais seulement une partie. Pour remplir les lignes donc, j'associe à chaque ligne un String considérée comme un "nom de code". Ce nom de code correspond au "nom de code" de mes données lues dans le shapefile.

    Les combobox situées dans la première ligne de mon datagridview permettent de choisir de quel GroupData je veux afficher les Data. Donc une fois que le GroupData est choisi, je fais une boucle sur les noms de code, afin de trouver la correspondance entre le "nom de code" de la ligne et le "nom de code" de mes données du shapefile. Et quand je l'ai, je vérifie le statut de l'objet Data, grâce à un switch. Je remplis les colonnes, une à une.

    C'est maintenant qu'intervient l'icône d'erreur. Selon le statut de mon Data, je mets un erreur d'icône ou pas.

    Pour pouvoir utiliser la propriété errorText des cellules, il faut apparemment que la cellule en question soit en mode édition. C'est pourquoi après la boucle sur les "noms de code" et avant le switch sur le statut de Data, je force la cellule à être en mode édition de la façon suivante :

    this->DataGridView->CurrentCell = this->DataGridView[e->ColumnIndex, index]; this->DataGridView->BeginEdit(false);

    (index est l'indice de ligne de correspondance entre "nom de code ligne du datagridview" et "nom de code Data")

    Je mets aussi en place l'évènement CellValidating :

    System::Void CellValidating(System::Object^  sender, System::Windows::Forms::DataGridViewCellValidatingEventArgs^  e) 
    {
          if (this->DataGridView->Visible)
          {
           this->DataGridView->Rows[e->RowIndex]->Cells[e->ColumnIndex]->ErrorText = "Error";
           }
    }

    Avec un point d'arrêt, je vois bien que je rentre dans la condition pour chaque ligne. Cependant, après avoir remplit des colonnes du tableau, les icônes d'erreur n'apparaissent pas sur toutes les lignes, mais seulement sur quelques lignes qui sont toujours les mêmes lignes.

    Je n'y comprends absolument plus rien.

    Cordialement,

    Rionms.

    jeudi 8 août 2013 07:57
  • Effectivement, lorsque je passe dans mon évènement CellValidating, je suis à l'indice de ligne e->RowIndex = (index-1). Je pense que c'est le
    this->DataGridView->CurrentCell = this->DataGridView[e->ColumnIndex, index];
    qui est responsable de ce décalage. Mais je ne saisis pas en quoi cela change l'affichage de l'icône. Mon évènement est appelé pour quasiment toutes les lignes, donc l'icône est censée s'afficher sur toutes les lignes, me trompe-je?

    • Modifié Rionms jeudi 8 août 2013 09:26
    jeudi 8 août 2013 09:21
  • Pouvez-vous  forcer la validation après avoir remplis les colonnes?

    CAD

    FOREACH colones

    FOREACH lignes

    datagridview[coll, ligne]->ErrorText ="error";

    NEXT

    NEXT


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    vendredi 9 août 2013 07:28
  • Bonjour,

    J'ai du passer à autre chose, je refais des essais aujourd'hui et vous tiens au courant.

    Merci.

    Riomns.

    lundi 19 août 2013 07:35
  • Bonjour,

    Cela ne marche pas. Pour je ne sais quelle raison, l'erreur d'icône ne veut s'afficher que dans les cellules des même lignes. Je vais donc insérer une image d'erreur d'icône. J'essaye maintenant d'insérer à la fois du texte et une image dans mes cellules.

    Merci encore,

    Cordialement,

    Rionms.

    lundi 26 août 2013 07:29