代码之家  ›  专栏  ›  技术社区  ›  Jason Down

如何从绑定到列表<T>或匿名类型的绑定源中获取适当的映射名称,以便在DataGridTableStyle上使用?

  •  15
  • Jason Down  · 技术社区  · 16 年前

    我试图创建一个DataGridTableStyle对象,以便控制DataGrid的列宽。我创建了一个绑定到列表的BindingSource对象。实际上,它绑定到通过Linq以以下方式创建的匿名类型列表(为了清楚地说明我正在做的事情,更改了变量名):

    List<myType> myList = new List<myType>(someCapacity);
    .
    ...populate the list with query from database...
    .
    
    var query = from i in myList
                select new
                {
                    i.FieldA,
                    i.FieldB,
                    i.FieldC
                };
    
    myBindingSource.DataSource = query;
    myDataGrid.DataSource = myBindingSource;
    

    我在谷歌搜索了大约1/2个小时,在一堆不同的论坛中不断看到同一个问题的链接(字面上是同一个文本,就像有人刚刚复制并粘贴了这个问题……我讨厌这个…)。不管怎么说,这些建议都不管用,就像那个家伙在所有其他网站上说的那样。

    这里有人知道我需要将MappingName属性设置为什么才能使我的表样式真正正常工作吗?我在哪里可以找到这个名字?(它不能为空…仅适用于绑定到DataTable或SqlCeResultSet等的BindingSource)。

    谢谢

    更新:

    我在下面贴了一个答案,解决了我的问题。不管这是否是最好的方法,它确实有效。如果你和我有同样的问题,值得一看。

    5 回复  |  直到 13 年前
        1
  •  26
  •   Jason Down    14 年前

    我已经找到了让这一切成功的方法。我会把它分成几个部分。。。


    List<myType> myList = new List<myType>(someCapacity);
    .
    ...populate the list with query from database...
    .
    

    DataGridTableStyle myDataGridTableStyle = new DatGridtTableStyle();
    DataGridTextBoxColumn colA = new DataGridTextBoxColumn();
    DataGridTextBoxColumn colB = new DataGridTextBoxColumn();
    DataGridTextBoxColumn colC = new DataGridTextBoxColumn();
    
    colA.MappingName = "FieldA";
    colA.HeaderText = "Field A";
    colA.Width = 50; // or whatever;
    
    colB.MappingName = "FieldB";
    .
    ... etc. (lather, rinse, repeat for each column I want)
    .
    
    myDataGridTableStyle.GridColumnStyles.Add(colA);
    myDataGridTableStyle.GridColumnStyles.Add(colB);
    myDataGridTableStyle.GridColumnStyles.Add(colC);
    

    var query = from i in myList
                select new
                {
                    i.FieldA,
                    i.FieldB,
                    i.FieldC
                };
    
    myBindingSource.DataSource = query.ToList(); // Thanks Marc Gravell
    
    // wasn't sure what else to pass in here, but null worked.
    myDataGridTableStyle.MappingName = myBindingSource.GetListName(null); 
    
    myDataGrid.TableStyles.Clear(); // Recommended on MSDN in the code examples.
    myDataGrid.TablesStyles.Add(myDataGridTableStyle);
    myDataGrid.DataSource = myBindingSource;
    

    因此,DataGridTableStyle.MappingName基本上需要知道它映射到的对象的类型。因为我的对象是匿名类型(使用Linq创建),所以直到运行时我才知道它是什么。将匿名类型的列表绑定到绑定源之后,

    希望这对其他人有用!

        2
  •  9
  •   Marcio Gabe    13 年前

    只需添加到本页已有的答案集合中。。。。

    List<MyType> 直接到DataGrid的DataSource属性,DataGrid实际上正在寻找MappingName为的DataGridTableStyle

    "List`1"
    

    而不是 MyType ...

    我只希望这能为已经提供的答案增添更多。谢谢你们为我提供指导方针。

        3
  •  2
  •   Marc Gravell    16 年前

    查询返回 IEnumerable<T> 对一些人来说 T IList (如有的话) IList<T> 实现)-尝试添加 .ToList()

    myBindingSource.DataSource = query.ToList();
    

    BindingList<T> 绑定列表<T> 存在于CF 3.5中),您可以添加扩展方法:

    static BindingList<T> ToBindingList<T>(this IEnumerable<T> data)
    {
        return new BindingList<T>(new List<T>(data));
    }
    

    myBindingSource.DataSource = query.ToBindingList();
    

    为了完整性,可以选择 伊里斯特 IListSource (甚至 Type 对于纯元数据场景),这是为什么 DataSource 通常键入为 object 数据来源 定义为 伊里斯特 ).

        4
  •  1
  •   JasonBSteele    14 年前

    此外,我发现没有必要列出()查询,因为BindingSource也会为您这样做。

    非常感谢杰森让我走上正轨。

        5
  •  0
  •   Tunaki    8 年前

    我在设置列宽时也面临同样的问题。 经过大量的研发,;D、 我改变了代码如下,它的工作良好。 代码:

    DataGridTableStyle tableStyle = new DataGridTableStyle();
    tableStyle.MappingName = dgCustom.DataSource.GetType().Name;
    

    dgCustom DataGrid ID在吗 dgCustom.DataSource.GetType().Name