【问题标题】:Set columns width in a datagrid using Compact Framework使用 Compact Framework 在数据网格中设置列宽
【发布时间】:2011-10-13 08:40:15
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    试试这个代码:

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

    【讨论】:

    • 我知道这是一个“老”问题,但想知道是否可以选择设置为“自动”?
    【解决方案2】:

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

    问题是DataGrid 有a private field called myGridTable 持有当前DataGridTableStyle。即使TableStyles 集合为空,当前的DataGridTableStyle 也存在,在这种情况下,它指向默认的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];
            }
        }
    }
    

    【讨论】:

    • 在 .NET Compact Framework 的某些版本中,此私有属性的名称为 m_tabstyActive
    【解决方案3】:

    我花了 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 2011-11-01
      • 2010-11-21
      • 2011-01-28
      • 1970-01-01
      相关资源
      最近更新 更多