使用Compact Framework在数据网格中设置列宽

我正在尝试设置数据网格中列的宽度。 我使用Compact Framework 2.0和C#

我试过这个,但它给了我一个“out of bonds”错误信息:

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

下面是使用数据表填充数据网格的代码(仅在我尝试设置列宽时失败):

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

试试这段代码:

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

DataGrid现在已经过时,但在更改一些遗留代码时我遇到了同样的问题,所以我将发布我的解决方案。

问题是DataGrid有一个名为myGridTable的私有字段 ,它保存当前的DataGridTableStyle 。 即使TableStyles集合为空,也存在当前的DataGridTableStyle ,在这种情况下,它指向默认的DataGridTableStyle ,它也是私有/内部的。

由于DataGrid无论如何已经过时并且不会被更改,我决定只使用Reflection来访问这些私有字段 。 无论如何他们应该是公开的并且将它们变成私人是一个糟糕的设计决定IMO。

直接使用当前样式的优点是您不需要销毁和重新创建表样式只是为了更改宽度,并且每次都不会出现意外行为。

我创建了一些扩展方法来做到这一点:

 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 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 widths) { var styles = grid.GetCurrentTableStyle().GridColumnStyles; for (int ii = 0; ii < widths.Count; ii++) { styles[ii].Width = widths[ii]; } } } 

我花了两天时间寻找上面的答案。 感谢您提供的出色解决方案。 这是一些vb代码,按列自定义列宽:

  ' 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