当前位置:  开发笔记 > 编程语言 > 正文

如何从绑定到List <T>或匿名类型的绑定源获取正确的映射名称,以便在DataGridTableStyle上使用?

如何解决《如何从绑定到List<T>或匿名类型的绑定源获取正确的映射名称,以便在DataGridTableStyle上使用?》经验,为你挑选了2个好方法。

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

List myList = new List(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;

然后我创建一个DataGridTableStyle对象并将其添加到datagrid.但是,它永远不会应用我设置的表格样式属性,因为我似乎无法设置正确的myDataGridTableStyle.MappingName属性.

我在谷歌搜索了大约1/2个小时,并且在一堆不同的论坛中一直看到相同问题的链接(字面意思是相同的文字,就像有人刚刚复制并粘贴了问题......我讨厌那个......) .无论如何,没有一个建议有效,就像那个人在所有其他网站上说的那样.

那么有谁知道我需要设置MappingName属性,以使我的TableStyle实际上正常工作?我在哪里可以从中获取名称?(它不能为空......只适用于绑定到DataTable或SqlCeResultSet等的BindingSource).

我认为这可能是一个问题,我使用Linq创建一个匿名的,更专业的对象版本,只有我需要的字段.我应该尝试将BindingSource直接绑定到List对象吗?或者甚至可以将DataGrid直接绑定到List对象并完全跳过绑定源.

谢谢

PS - C#,Compact Framework v3.5

更新:

我在下面发布了一个解决了我的问题的答案.无论它是否是最好的方法,它确实有效.值得一看,如果你遇到同样的问题.



1> Jason Down..:

我找到了实现这项工作的方法.我会把它分成几部分......


List myList = new List(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创建),我不知道它是什么,直到运行时.在将匿名类型的列表绑定到绑定源之后,我可以使用BindingSource.GetListName(null)来获取匿名类型的字符串表示形式.

有一点需要注意.如果我只是将myList(类型为"myType")直接绑定到绑定源,我可以使用字符串"myType"作为DataGridTableStyle.MappingName的值.

希望这对其他人有用!



2> Marcio Gabe..:

只是添加到此页面上已有的答案集合....

我对使用Windows窗体和紧凑框架(适用于Windows Mobile 6.5)开发我的拳头应用程序的同样问题感到沮丧.

我通过上面的Marc Gravell的评论发现,确实有可能获得运行时MappingName检查DataGrid的属性.这样做我发现当我List直接绑定到DataGrid的DataSource属性时,DataGrid实际上正在寻找一个DataName为GraceName的DataGridTableStyle

"List`1"

而不是任何组合ListMyType......

所以...通过在DataGridTableStyle集合编辑器上的映射名称中放置"List`1"(在设计时),我能够自定义列和其他属性,而无需在运行时创建它们.

我希望这会为已经提供的答案增加更多.谢谢大家为我提供的指导方针.


+1 - 另一种方法是使用tableStyle.MappingName = yourList.GetType().Name; 我看到了[这里](http://stackoverflow.com/a/866337/743433)
推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有