Установите ширину столбцов в сетке данных с помощью Compact Framework - PullRequest
8 голосов
/ 26 июля 2011

Я пытаюсь установить ширину столбцов в моей сетке данных. Я использую 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 ]

19 голосов
/ 26 июля 2011

Попробуйте этот код:

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 голосов
/ 03 октября 2016

DataGrid устарел, но я столкнулся с той же проблемой при изменении устаревшего кода, поэтому я опубликую свое решение.

Проблема в том, что DataGrid имеет закрытое поле myGridTable , в котором хранится текущий DataGridTableStyle. Текущий DataGridTableStyle существует, даже если коллекция TableStyles пуста, и в этом случае она указывает на значение по умолчанию 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<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 голосов
/ 14 августа 2014

Большую часть двух дней я потратил на поиски ответа выше. Спасибо за предоставленные отличные решения. Вот некоторый код 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
...