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
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
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 :
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 <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>
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.
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++; } } }
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
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 :
Et zou... Une version C# et ASP.NET qui font à peu près la même chose en 1 heure
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++; } } }![]()
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
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![]()
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
N'y a t-il pas une maniere plus directe de tester un type ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part System.Type.GetType("System.Int16"));
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; } }
Partager