8

J'essaie de définir la largeur des colonnes de ma grille de données. J'utilise Compact Framework 2.0 et C#Définir la largeur des colonnes dans une grille de données à l'aide de Compact Framework

J'ai essayé mais il me donne un message d'erreur « des obligations »:

foreach (DataGridColumnStyle vColumnStyle in dataGrid1.TableStyles[0].GridColumnStyles) 
{ 
    vColumnStyle.Width = 100; 
} 

Voici le code pour remplir mon DataGrid avec le datatable (échoue seulement quand je essayez de définir la largeur des colonnes):

void FillData() 
{ 
    // 1 
    // Open connection 
    string conString = "Data Source=\\Program Files\\smartdeviceproject2\\repartocrack.sdf"; 
    using (SqlCeConnection c = new SqlCeConnection(conString)) 
    { 
     c.Open(); 
     // 2 
     // Create new DataAdapter 
     using (SqlCeDataAdapter a = new SqlCeDataAdapter(
     "SELECT codbultocomp, nombre, estado FROM envios INNER JOIN tiendas ON envios.codigodestino = tiendas.codigodestino", c)) 
     { 
      // 3 
      // Use DataAdapter to fill DataTable 
      DataTable t = new DataTable(); 
      a.Fill(t); 
      // 4 
      // Render data onto the screen 
      foreach (DataGridColumnStyle vColumnStyle in dataGrid1.TableStyles[0].GridColumnStyles) 
      { 
       vColumnStyle.Width = 100; 
      } 
      dataGrid1.DataSource = t; 
     } 
    } 
} 

Répondre

19

essayez ce code:

dataGrid1.TableStyles.Clear(); 
DataGridTableStyle tableStyle = new DataGridTableStyle(); 
tableStyle.MappingName = t.TableName; 
foreach (DataColumn item in t.Columns) 
{ 
    DataGridTextBoxColumn tbcName = new DataGridTextBoxColumn(); 
    tbcName.Width = 100; 
    tbcName.MappingName = item.ColumnName; 
    tbcName.HeaderText = item.ColumnName; 
    tableStyle.GridColumnStyles.Add(tbcName); 
} 
dataGrid1.TableStyles.Add(tableStyle); 
+0

Merci, qui a fonctionné comme un charme! – rfc1484

+0

agréable d'entendre :) – Reniuz

+0

Je comprends que c'est une "vieille" question, mais je me demandais si la mise à "Auto" est une option? –

0

J'ai passé une bonne partie de 2 jours à la recherche de la réponse ci-dessus. Merci pour les excellentes solutions fournies. Voici un code de vb, avec une personnalisation des largeurs de colonne par colonne:

' trgAppt is defined as system.windows.forms.datagrid 
    trgAppt.TableStyles.Clear() 
    Dim tableStyle As DataGridTableStyle 
    tableStyle = New DataGridTableStyle 
    tableStyle.MappingName = dtAppt.TableName 
    For Each myItem As DataColumn In dtAppt.Columns 
    Dim tbcName As DataGridTextBoxColumn = New DataGridTextBoxColumn 
    Select Case myItem.ColumnName.ToString.ToUpper 
    Case "STOP" 
     tbcName.Width = 35 
    Case "ORDER" 
     tbcName.Width = 45 
    Case "CUSTOMER" 
     tbcName.Width = 70 
    Case "QTY" 
     tbcName.Width = 35 
    End Select 
    tbcName.MappingName = myItem.ColumnName 
    tbcName.HeaderText = myItem.ColumnName 
    tableStyle.GridColumnStyles.Add(tbcName) 
    tbcName = Nothing 
    Next 
    trgAppt.TableStyles.Add(tableStyle) 
    trgAppt.DataSource = dtAppt 
1

DataGrid est maintenant obsolète, mais j'ai rencontré le même problème lors du changement du code de l'héritage, donc je vais poster ma solution.

Le problème est que DataGrid a a private field called myGridTable qui contient le courant DataGridTableStyle. Un DataGridTableStyle actuel existe même si la collection TableStyles est vide, auquel cas il pointe sur un DataGridTableStyle par défaut qui est également privé/interne.

Étant donné que DataGrid est obsolète de toute façon et ne sera pas modifié, j'ai décidé de just use Reflection to access those private fields. Ils auraient dû être publics de toute façon et les rendre privés était une mauvaise décision de conception de l'OMI. L'avantage de travailler directement avec les styles actuels est que vous n'avez pas besoin de détruire et de recréer les styles de tableaux juste pour changer les largeurs, et cela fonctionne sans comportement inattendu à chaque fois.

J'ai créé quelques méthodes d'extension pour le faire:

static class DataGridColumnWidthExtensions 
{ 
    public static DataGridTableStyle GetCurrentTableStyle(this DataGrid grid) 
    { 
     FieldInfo[] fields = grid.GetType().GetFields(
        BindingFlags.NonPublic | 
        BindingFlags.Instance); 

     return (DataGridTableStyle)fields.First(item => item.Name == "myGridTable").GetValue(grid); 
    } 

    public static IList<int> GetColumnWidths(this DataGrid grid) 
    { 
     var styles = grid.GetCurrentTableStyle().GridColumnStyles; 

     var widths = new int[styles.Count]; 
     for (int ii = 0; ii < widths.Length; ii++) 
     { 
      widths[ii] = styles[ii].Width; 
     } 

     return widths; 
    } 

    public static void SetColumnWidths(this DataGrid grid, IList<int> widths) 
    { 
     var styles = grid.GetCurrentTableStyle().GridColumnStyles; 

     for (int ii = 0; ii < widths.Count; ii++) 
     { 
      styles[ii].Width = widths[ii]; 
     } 
    } 
} 
+0

Dans certaines versions de .NET Compact Framework le nom de cette propriété privée est 'm_tabstyActive' – ngu

Questions connexes