2011-07-26 20 views
8

Próbuję ustawić szerokość kolumn w moim datagrid. Używam Compact Framework 2.0 i C#Ustawianie szerokości kolumn w datagrid przy użyciu Compact Framework

próbowałem tego, ale to daje mi „z obligacji” komunikat o błędzie:

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

Oto kod do napełniania moje datagrid z DataTable (tylko nie kiedy spróbuj ustawić szerokość kolumny):

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; 
     } 
    } 
} 

Odpowiedz

19

Spróbuj kod:

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

Dzięki, że pracował jak urok! – rfc1484

+0

miło słyszeć :) – Reniuz

+0

Rozumiem, że jest to "stare" pytanie, ale zastanawiam się, czy opcja "Auto" jest opcją? –

0

spędziłem większą część 2 dni szukających odpowiedzi powyżej. Dzięki za świetne rozwiązania. Oto niektóre kodu VB, o dostosowanie szerokości kolumny kolumny:

' 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 jest już przestarzały, ale napotkał ten sam problem przy zmianie kodu starszego więc wyślę moje rozwiązanie.

Problem polega na tym, że DataGrid ma a private field called myGridTable, który przechowuje bieżący DataGridTableStyle. Bieżący DataGridTableStyle istnieje nawet wtedy, gdy kolekcja TableStyles jest pusta. W takim przypadku wskazuje ona domyślną wartość DataGridTableStyle, która również jest prywatna/wewnętrzna.

Ponieważ DataGrid i tak jest nieaktualna i nie zostanie zmieniona, zdecydowałem się na just use Reflection to access those private fields. Powinny być i tak publiczne, a uczynienie ich prywatnymi było złym decyzją projektową IMO.

Zaletą bezpośredniej pracy z bieżącymi stylami jest to, że nie trzeba niszczyć i odtwarzać stylów tabel tylko po to, aby zmieniać szerokości, i za każdym razem działa bez niespodziewanego zachowania.

stworzyłem kilka metod rozszerzenie to zrobić:

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

W niektórych wersjach .NET Compact Framework nazwa tej prywatnej własności to 'm_tabstyActive' – ngu

Powiązane problemy