Windows Mobile / .Net Compact Framework - Как связать общие списки с сеткой данных - PullRequest
4 голосов
/ 20 августа 2009

Я создаю небольшое приложение vb, используя последнюю версию .net compact framework. Элемент управления сеткой данных немного более ограничен, чем я привык.

Я вижу множество примеров, в которых я могу связать источник данных сетки с набором данных / таблицей данных. Можно ли привязать к общему списку? Если да, то как?

Ответы [ 3 ]

11 голосов
/ 24 августа 2009

Вы можете просто добавить список в источник данных, но затем вам нужно проделать дополнительную работу, чтобы столбцы выглядели так, как вы хотите.

Я делаю это все время на самом деле, но это немного запутано. Обратите внимание, что мой пример использует .net 3.5 и некоторые функции C # 3.0, чтобы упростить его.

Во-первых, вот методы расширения, которые я использую:

    public static T SelectedItem<T>(this DataGrid ctrl)
    {
        var cell = ctrl.CurrentCell;

        var list = (IList<T>)ctrl.DataSource;

        if (list == null)
            return default(T);
        if (list.Count == 0)
            return default(T);

        return list[cell.RowNumber];
    }

    private static void AddColumn(this GridColumnStylesCollection list, string header, string columnName, int width)
    {
        list.Add(
            new DataGridTextBoxColumn
            {
                HeaderText = header,
                MappingName = columnName,
                Width = width
            });
        return;
    }

    public static void SetColumnStyles<T>(this DataGrid ctrl, T data, params ColumnStyle[] column) where T : class
    {
        var ts = new DataGridTableStyle();
        ts.MappingName = data.GetType().Name;

        for (int i = 0; i < column.Length; i++)
        {
            var style = column[i];
            ts.GridColumnStyles.AddColumn(style.Header, style.Column, style.Width);
        }

        ctrl.TableStyles.Clear();
        ctrl.TableStyles.Add(ts);
    }

И этот маленький класс:

public class ColumnStyle
{
    public string Header { get; private set; }
    public string Column { get; private set; }
    public int Width { get; private set; }

    public ColumnStyle(string header, string column, int width)
    {
        Header = header;
        Column = column;
        Width = width;
    }

    public ColumnStyle(string column, int width)
    {
        Column = column;
        Header = column;
        Width = width;
    }
}

Это настройка, а вот выигрыш: взятие общего списка, уточнение имен столбцов и их ширины:

    public void LoadInventoryList(IList<InventoryItemSmall> list)
    {
        inventoryGrid.SuspendLayout();

        inventoryGrid.DataSource = list;
        inventoryGrid.SetColumnStyles(list, new[]
                                          {
                                              new ColumnStyle("Name", 170),
                                              new ColumnStyle("Size", 30),
                                              new ColumnStyle("Quantity", 30)
                                          });
        inventoryGrid.ResumeLayout();
    }
2 голосов
/ 20 августа 2009

Если вы используете 3.5 или 2.0, вы можете использовать BindingList .

0 голосов
/ 20 августа 2009

Я не думаю, что есть встроенный способ привязки общих списков к сетке данных. Однако вы можете довольно легко создать UserControl, который наследует от datagrid, и переопределить / перегрузить методы привязки для размещения общих списков. Основной подход к этому состоит в том, чтобы сгенерировать DataTable из общего списка и связать сгенерированный DataTable с базовой сеткой данных. Конечно, такой подход будет доступен только для чтения.

...