我正在尝试设置数据网格中列的宽度。我使用Compact Framework 2.0和C#
我试过了,但它给了我一个“脱离债券”的错误信息:
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;
}
}
}
答案 0 :(得分:19)
试试这段代码:
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);
答案 1 :(得分:2)
DataGrid现在已经过时但我在更改一些遗留代码时遇到了同样的问题,因此我会发布我的解决方案。
问题是DataGrid的a private field called myGridTable持有当前DataGridTableStyle
。即使DataGridTableStyle
集合为空,也存在当前TableStyles
,在这种情况下,它指向默认的DataGridTableStyle
,也是私有/内部。
由于DataGrid无论如何已经过时并且无法更改,我决定just use Reflection to access those private fields。无论如何他们应该是公开的并且将它们变成私人是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<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];
}
}
}
答案 2 :(得分:0)
我花了2天时间寻找上面的答案。感谢您提供的出色解决方案。这是一些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