2011-07-26 10 views
8

Estoy tratando de establecer el ancho de las columnas en mi cuadrícula de datos. Yo uso Compact Framework 2.0 y C#Establecer ancho de columnas en una cuadrícula de datos utilizando Compact Framework

yo tratamos de esto, pero me da un "fuera de bonos" mensaje de error:

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

Este es el código para llenar mi cuadrícula de datos con la tabla de datos (sólo falla cuando tratan de establecer el ancho de las columnas):

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

Respuesta

19

probar este código:

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

Gracias, que funcionó como un encanto! – rfc1484

+0

nice to heard :) – Reniuz

+0

Entiendo que esta es una pregunta "antigua" pero me pregunto si la configuración de "Auto" es una opción. –

0

yo pasamos una buena parte de 2 días buscando la respuesta anterior. Gracias por las excelentes soluciones proporcionadas. Aquí hay un código VB, con una personalización de los anchos de columna por columna:

' 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

cuadrícula de datos está obsoleta, pero me encontré con el mismo problema cuando se cambia algún código heredado por lo que voy a publicar mi solución.

El problema es que DataGrid tiene a private field called myGridTable que contiene el DataGridTableStyle actual. Existe una corriente DataGridTableStyle incluso si la colección TableStyles está vacía, en cuyo caso apunta a un valor predeterminado DataGridTableStyle que también es privado/interno.

Dado que DataGrid está obsoleto de todos modos y no se cambiará, decidí just use Reflection to access those private fields. Deberían haber sido públicos de todos modos y hacerlos privados fue una decisión de diseño incorrecta OMI.

La ventaja de trabajar directamente con los estilos actuales es que no necesita destruir y volver a crear los estilos de tabla solo para cambiar los anchos, y funciona sin un comportamiento inesperado todo el tiempo.

he creado un par de métodos de extensión de hacerlo:

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

En algunas versiones de .NET Compact Framework, el nombre de esta propiedad privada es 'm_tabstyActive' – ngu

Cuestiones relacionadas