如何从绑定到List 或匿名类型的绑定源获取正确的映射名称,以便在DataGridTableStyle上使用?
我正在尝试创建一个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
更新:
我在下面发布了一个解决了我的问题的答案。 无论它是否是最好的方法,它确实有效。 值得一看,如果你遇到同样的问题。
我找到了实现这项工作的方法。 我会把它分成几部分……
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)来获取匿名类型的字符串表示forms。
有一点需要注意。 如果我只是将myList(类型为“myType”)直接绑定到绑定源,我可以使用字符串“myType”作为DataGridTableStyle.MappingName的值。
希望这对其他人有用!
只是添加到此页面上已有的答案集合….
我对使用Windows窗体和紧凑框架(适用于Windows Mobile 6.5)开发我的第一个应用程序的同样问题感到沮丧。
我通过上面的Marc Gravell的评论发现,确实有可能获得运行时MappingName检查DataGrid的属性。 这样做我发现当我将List
直接绑定到DataGrid的DataSource属性时,DataGrid实际上正在寻找一个DataName为GraceName的DataGridTableStyle
"List`1"
而不是List
或MyType
的任何组合……
所以…通过在DataGridTableStyle集合编辑器上的映射名称中放置“List`1”(在设计时),我能够自定义列和其他属性,而无需在运行时创建它们。
我希望这会为已经提供的答案增加更多。 谢谢大家为我提供的指导方针。
查询为某些T
返回IEnumerable
,但大多数绑定源(ASP.NET除外)需要IList
(例如任何IList
实现) – 尝试添加.ToList()
– 即
myBindingSource.DataSource = query.ToList();
BindingList
可能更好(如果CF 3.5支持),因为它可以更好地支持一些常见的绑定方案; 如果你需要这个(假设CF 3.5上存在BindingList
),你可以添加一个扩展方法:
static BindingList ToBindingList (this IEnumerable data) { return new BindingList (new List (data)); }
然后打电话:
myBindingSource.DataSource = query.ToBindingList();
为了完整性, IList
的替代方法是IListSource
(甚至是纯元数据方案的Type
),这就是为什么DataSource
通常被输入为object
; 如果不是这个问题,编译器可能会告诉你问题(即DataSource
被定义为IList
)。
我按照这个答案发现MappingName总是成为底层类名(示例中的myType)。
因此,似乎将它通过BindingSource放入集合中无论如何都能解决问题,因此不需要BindingSource.GetListName(null)。
此外,我发现不需要ToList()查询,因为BindingSource也会为您执行此操作。
非常感谢Jason Down让我走上正轨。
我在设置列宽方面面临同样的问题。 经过大量的研发,我改变了下面的代码,工作正常。 码:
DataGridTableStyle tableStyle = new DataGridTableStyle(); tableStyle.MappingName = dgCustom.DataSource.GetType().Name;
其中dgCustom
是dgCustom.DataSource.GetType().Name
DataGrid ID dgCustom.DataSource.GetType().Name
工作完美的dgCustom.DataSource.GetType().Name
。
上述就是C#学习教程:如何从绑定到List 或匿名类型的绑定源获取正确的映射名称,以便在DataGridTableStyle上使用?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/942771.html