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

C# Discussion :

tester le datatype d'un datagridview column


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut tester le datatype d'un datagridview column
    Bonsoir

    Je cherche comment tester le type de colonne dans un datagridview

    Essentiellement si c'est de type string ou numerique afin de faire l'allignement a droite pour du numerique

    Mais si déja je pouvais tester si c'est int je serais content

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 20
    Par défaut
    Puisque tu parles de DataGrid, je suppose que tu voulais parler de ASP.NET

    Dans ce cas, voici un extrait du fichier .aspx contenant le DataGrid en lui même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            <asp:DataGrid ID="dtGrid" runat="server" CellPadding="4" ForeColor="#333333" 
                GridLines="None" AutoGenerateColumns="false" Width="100%" OnPreRender="preRender">
                <Columns>
                    <asp:BoundColumn DataField="colonne1" HeaderText="col1" ItemStyle-Width="33%" />
                    <asp:BoundColumn DataField="colonne2" HeaderText="col2" ItemStyle-Width="33%" />
                    <asp:BoundColumn DataField="colonne3" HeaderText="col3" ItemStyle-Width="33%" />
                </Columns>
            </asp:DataGrid>
    Et le contenu de l'aspx.cs :

    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
     
    protected void Page_Load(object sender, EventArgs e)
        {
            DataTable tbl = new DataTable();
            tbl.Columns.Add("colonne1");
            tbl.Columns.Add("colonne2");
            tbl.Columns.Add("colonne3");
     
            DataRow row1 = tbl.NewRow();
            row1["colonne1"] = 1;
            row1["colonne2"] = "aa";
            row1["colonne3"] = DateTime.Now;
            tbl.Rows.Add(row1);
     
            DataRow row2 = tbl.NewRow();
            row2["colonne1"] = 1;
            row2["colonne2"] = "aa";
            row2["colonne3"] = DateTime.Now;
            tbl.Rows.Add(row2);
     
            DataRow row3 = tbl.NewRow();
            row3["colonne1"] = 1;
            row3["colonne2"] = "aa";
            row3["colonne3"] = DateTime.Now;
            tbl.Rows.Add(row3);
     
            dtGrid.DataSource = tbl;
            dtGrid.DataBind();
        }
     
        protected void preRender(object sender, EventArgs e)
        {
            if (dtGrid.DataSource != null)
            {
                DataTable tbl = (DataTable)dtGrid.DataSource;
     
                int idRow = 0;
                int idCol = 0;
                foreach (DataRow row in tbl.Rows)
                {
                    idCol = 0;
                    foreach (string valeur in row.ItemArray)
                    {
                        int intOut = 0;
                        DateTime dateOut = DateTime.Now;
                        if (Int32.TryParse(valeur, out intOut))
                            dtGrid.Items[idRow].Cells[idCol].HorizontalAlign = HorizontalAlign.Right;
                        else if (DateTime.TryParse(valeur, out dateOut))
                            dtGrid.Items[idRow].Cells[idCol].HorizontalAlign = HorizontalAlign.Center;
     
                        idCol++;
                    }
                    idRow++;
                }
            }
        }
    Pour résumer, le DataGrid utilise l'événement onPreRender et la fonction parse ton DataTable et teste les types avant de les aligner correctement.

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Merci

    Mais je parle de DataGridView
    et de Csharp

    L'allignement par défaut se fait a gauche
    Je voudrais identifier les colonnes contenant du numerique pour les alligner a droite

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 20
    Par défaut
    Ah ben, je devrais aller me coucher :p

    Le principe est sensiblement le même...

    L'événement onPreRender est remplacé par l'événement DataBindingComplete de ton DataGridView. Plus quelques propriétés qui changent à gauche et à droite dans l'événement.

    Voici le code :

    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
     
    public Form2()
            {
                InitializeComponent();
                DataTable tbl = new DataTable();
                tbl.Columns.Add("colonne1");
                tbl.Columns.Add("colonne2");
                tbl.Columns.Add("colonne3");
     
                DataRow row1 = tbl.NewRow();
                row1["colonne1"] = 1;
                row1["colonne2"] = "aa";
                row1["colonne3"] = DateTime.Now;
                tbl.Rows.Add(row1);
     
                DataRow row2 = tbl.NewRow();
                row2["colonne1"] = 1;
                row2["colonne2"] = "aa";
                row2["colonne3"] = DateTime.Now;
                tbl.Rows.Add(row2);
     
                DataRow row3 = tbl.NewRow();
                row3["colonne1"] = 1;
                row3["colonne2"] = "aa";
                row3["colonne3"] = DateTime.Now;
                tbl.Rows.Add(row3);
     
                dataGridView1.DataSource = tbl;
     
                dataGridView1.DataBindingComplete += new DataGridViewBindingCompleteEventHandler(dataGridView1_DataBindingComplete);
            }
     
            void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
            {
                if (dataGridView1.DataSource != null)
                {
                    DataTable tbl = (DataTable)dataGridView1.DataSource;
     
                    int idRow = 0;
                    int idCol = 0;
                    foreach (DataRow row in tbl.Rows)
                    {
                        idCol = 0;
                        foreach (string valeur in row.ItemArray)
                        {
                            int intOut = 0;
                            DateTime dateOut = DateTime.Now;
                            if (Int32.TryParse(valeur, out intOut))
                                dataGridView1.Rows[idRow].Cells[idCol].Style.Alignment = DataGridViewContentAlignment.MiddleRight;
                            else if (DateTime.TryParse(valeur, out dateOut))
                                dataGridView1.Rows[idRow].Cells[idCol].Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
     
                            idCol++;
                        }
                        idRow++;
                    }
                }
            }
    Et zou... Une version C# et ASP.NET qui font à peu près la même chose en 1 heure

  5. #5
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Salut

    Ca me parrait quand meme curieux qu'il n'y a pas de methode plus explicite pour connaitre le type d'une colonne que de faire des tryparse dans les cellules

    Le type doit etre une propritété de la colonne car quand on introduit du texte dans une colonne numerique il ne se prive pas d'envoyer une gentille exception

  6. #6
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Tout simplement en testant le type sous-jacent à la colonne, si tu es bindé sur un objet métier par exemple, cf. la propriété DataPropertyName de la colonne. Un coup de réflexion pour récupérer le type de la propriété et c'est gagné je pense. En théorie en tout cas, après à voir en pratique ce que cela donne

  7. #7
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Salut

    D'accord avec toi mais aller tester le type sous-jacent dans ce cas me parait un peu lourd
    Le DGV doit bien connaitre son type

    Mais j'ai trouvé !

    Il faut tester le valuetype
    Pour ceux que ca intéresse, voici une petite methode générique

    DEUX choses me chipotent encore

    1-
    L'usage du GetType

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Type.GetType("System.Int16"));
    N'y a t-il pas une maniere plus directe de tester un type ?


    2- La nécessité de parcourir tous les type possible : n'y a-til pas un type générique "Numeric"


    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
          bool isNumeric = false;
          for (int i = 0; i < dgv_gen.ColumnCount; i++)
          {
            System.Type Tp = dgv_gen.Columns[i].ValueType;
     
            isNumeric = (Tp == System.Type.GetType("System.Byte"));
            if (!isNumeric) isNumeric = (Tp == System.Type.GetType("System.Int16"));
            if (!isNumeric) isNumeric = (Tp == System.Type.GetType("System.Int32"));
            if (!isNumeric) isNumeric = (Tp == System.Type.GetType("System.Int64"));
            if (!isNumeric) isNumeric = (Tp == System.Type.GetType("System.UInt16"));
            if (!isNumeric) isNumeric = (Tp == System.Type.GetType("System.UInt32"));
            if (!isNumeric) isNumeric = (Tp == System.Type.GetType("System.UInt64"));
            if (!isNumeric) isNumeric = (Tp == System.Type.GetType("System.double"));
     
            if (isNumeric)
            {
              dgv_gen.Columns[i].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
            }
          }

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

Discussions similaires

  1. Tester l'index d'un DataGridView
    Par sebbonard dans le forum VB.NET
    Réponses: 3
    Dernier message: 29/10/2012, 23h16
  2. [Débutant] datagridview.column(0).celltype + vb.net
    Par misscricri dans le forum Windows Forms
    Réponses: 3
    Dernier message: 12/04/2012, 18h00
  3. Datagridview Column Header avec look Toolstrip
    Par olibara dans le forum Windows Forms
    Réponses: 0
    Dernier message: 07/06/2010, 22h35
  4. Custom DataGridView Column
    Par Knightrider dans le forum Windows Forms
    Réponses: 0
    Dernier message: 26/08/2009, 12h16
  5. [vb2005]Tester la valeur d'une cellule d'un datagridview
    Par stargates dans le forum Windows Forms
    Réponses: 5
    Dernier message: 13/07/2006, 10h09

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