Meilleur auteur de réponses
Réorganisation colonnes datagridview et excel

Question
-
Bonjour,
Voila mon problème :
J'ai autorisé, sur ma datagridview, la réorganisation des colonnes. Quand j'exporte ma datagridview dans Excel, j'ai "l'ancien" ordre de colonne (celui par défaut) et non celui fait par l'utilisateur. Comment faire pour que les colonnes que déplace l'utilisateur apparaissent dans l'ordre qu'il a choisit lors de l'export Excel?
Réponses
-
Effectivement lors d'un foreach sur la collection de colonne, l'ordre d'affichage n'est pas pris en compte
Par contre avec la propriété DisplayIndex cela fonctionne.
Tu peux soit faire une première boucle pour stocker le display index de chaque column et effectuer un tri, ou mieux utiliser LINQ.
Par exemple pour obtenir la liste des colonnes triées par displayIndex :foreach (DataGridViewColumn col in dgv.Columns.Cast<DataGridViewColumn>().OrderBy( col => col.DisplayIndex ) ) { .... }
- Proposé comme réponse nikhoModerator mercredi 10 juin 2009 13:02
- Marqué comme réponse salokin38 mercredi 10 juin 2009 14:23
Toutes les réponses
-
-
try { Workbook classeur = (Workbook)excel.Workbooks.Add(Missing.Value); Worksheet feuille = (Worksheet)excel.ActiveSheet; excel.UserControl = true; int colIndex = 1; bool ligne = false; foreach (DataGridViewColumn column in dgv.Columns) { Microsoft.Office.Interop.Excel.Range rangEnteteColonne = (Microsoft.Office.Interop.Excel.Range)excel.Cells[1, colIndex]; rangEnteteColonne.Font.Bold = true; rangEnteteColonne.BorderAround(Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous, Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin, Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic, Missing.Value); rangEnteteColonne.Interior.ColorIndex = 36; rangEnteteColonne.Value2 = column.HeaderText; for (int j = 0; j < dgv.Rows.Count; j++) { Microsoft.Office.Interop.Excel.Range rangContenu = (Microsoft.Office.Interop.Excel.Range)excel.Cells[j + 2, colIndex]; rangContenu.BorderAround(Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous, Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin, Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic, Missing.Value); if (ligne) { rangContenu.Interior.ColorIndex = 35; ligne = false; } else { ligne = true; } rangContenu.Value2 = dgv.Rows[j].Cells[colIndex - 1].Value.ToString().Trim(); } ligne = false; colIndex++; } feuille.Columns.AutoFit(); excel.Visible = true; } catch (Exception ex) { Console.Write(ex.StackTrace); excel.Quit(); excel = null; }
Voila. Ca me désespère, j'ai essayé avec le diplay index, mais dès que je bouge plus d'une colonne, ils sont tous faux les display index. -
Effectivement lors d'un foreach sur la collection de colonne, l'ordre d'affichage n'est pas pris en compte
Par contre avec la propriété DisplayIndex cela fonctionne.
Tu peux soit faire une première boucle pour stocker le display index de chaque column et effectuer un tri, ou mieux utiliser LINQ.
Par exemple pour obtenir la liste des colonnes triées par displayIndex :foreach (DataGridViewColumn col in dgv.Columns.Cast<DataGridViewColumn>().OrderBy( col => col.DisplayIndex ) ) { .... }
- Proposé comme réponse nikhoModerator mercredi 10 juin 2009 13:02
- Marqué comme réponse salokin38 mercredi 10 juin 2009 14:23
-
-