none
Réorganisation colonnes datagridview et excel RRS feed

  • 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?
    mardi 9 juin 2009 19:40

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
    mercredi 10 juin 2009 10:52
    Modérateur

Toutes les réponses

  • Peux tu nous montrer la portion de code qui rélise ton export ?
    mercredi 10 juin 2009 10:07
    Modérateur
  •          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.
    mercredi 10 juin 2009 10:17
  • 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
    mercredi 10 juin 2009 10:52
    Modérateur
  • Un grand merci, je ne connaissais pas du tout LINQ(enfin seulement de nom). Je pense m'y mettre maintenant.
    Ca marche nikel!
    Mercii Merci!
    mercredi 10 juin 2009 12:43
  • Pas de quoi, Pense à valider les réponses quand ton problème est résolu.
    mercredi 10 juin 2009 13:02
    Modérateur