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

时间:2011-07-26 11:50:51

标签: c# visual-studio-2008 datagrid compact-framework datatable

我正在尝试设置数据网格中列的宽度。我使用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;
        }
    }
}

3 个答案:

答案 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