Windows mobile Windows Mobile/.Net Compact Framework-如何将通用列表绑定到datagrid

Windows mobile Windows Mobile/.Net Compact Framework-如何将通用列表绑定到datagrid,windows-mobile,compact-framework,datagrid,Windows Mobile,Compact Framework,Datagrid,我正在使用最新版本的.net compact framework构建一个小型vb应用程序。datagrid控件的限制比我习惯的要多一些 我看到了很多可以将网格的数据源绑定到dataset/datatable的示例。是否可以绑定到通用列表?如果是这样,怎么做?我认为没有一种内置的方式将通用列表绑定到数据网格。但是,您可以相当轻松地创建从datagrid继承的UserControl,并重写/重载绑定方法以适应通用列表。实现这一点的基本方法是从通用列表生成DataTable,并将生成的DataTabl

我正在使用最新版本的.net compact framework构建一个小型vb应用程序。datagrid控件的限制比我习惯的要多一些


我看到了很多可以将网格的数据源绑定到dataset/datatable的示例。是否可以绑定到通用列表?如果是这样,怎么做?

我认为没有一种内置的方式将通用列表绑定到数据网格。但是,您可以相当轻松地创建从datagrid继承的UserControl,并重写/重载绑定方法以适应通用列表。实现这一点的基本方法是从通用列表生成DataTable,并将生成的DataTable绑定到基本datagrid。当然,这种方法是只读的。

如果您使用的是3.5或2.0,您可以使用。

您只需将列表添加到数据源中,然后您需要做更多的工作,以使列的外观符合您的要求

实际上,我一直都在这样做,但有点牵扯其中。请注意,我的示例使用了.NET3.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 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();
    }
public void LoadInventoryList(IList列表)
{
inventoryGrid.SuspendLayout();
inventoryGrid.DataSource=列表;
inventoryGrid.SetColumnStyles(列表,新[]
{
新的专栏风格(“名称”,170),
新柱样式(“尺寸”,30),
新列样式(“数量”,30)
});
inventoryGrid.ResumeLayout();
}

我在这方面的映射名称有问题,如果我在数据源上执行.ToArray(),它就可以正常工作。
    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();
    }