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

StackOverflow https://stackoverflow.com/questions/420386

我正在尝试创建一个DataGridTableStyle对象,以便我可以控制DataGrid的列宽。我创建了一个绑定到List的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;

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

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

所以这里的任何人都知道我需要将MappingName属性设置为什么才能使我的TableStyle实际正常工作?我在哪里可以从中获取名称? (它不能为空......只适用于绑定到DataTable或SqlCeResultSet等的BindingSource)。

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

由于

PS - C#,Compact Framework v3.5

更新:

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

有帮助吗?

解决方案

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


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

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

希望这对其他人有用!

其他提示

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

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

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

的DataGridTableStyle
"List`1"

而不是 List&lt; MyType&gt; MyType ...

的任意组合

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

我希望这会为已经提供的答案增加更多内容。谢谢大家为我提供指导。

对于某些 T ,查询返回 IEnumerable&lt; T&gt; ,但大多数绑定源(ASP.NET除外)需要 IList (例如任何 IList&lt; T&gt; 实现) - 尝试添加 .ToList() - 即

myBindingSource.DataSource = query.ToList();

BindingList&lt; T&gt; 可能会更好(如果CF 3.5支持),因为它可以更好地支持某些常见的绑定方案;如果你需要这个(假设CF 3.5上存在 BindingList&lt; T&gt; ),你可以添加一个扩展方法:

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

然后致电:

myBindingSource.DataSource = query.ToBindingList();

为了完整性, IList 的替代方法是 IListSource (甚至 Type 用于纯元数据方案),这就是为什么 DataSource 通常输入为 object ;如果不是这个问题,编译器可能会告诉你问题(即 DataSource 被定义为 IList )。

我按照这个答案发现MappingName总是出现为底层类名(示例中的myType)。

所以似乎将它通过BindingSource放入集合中无论如何都能解决问题,而且不需要BindingSource.GetListName(null)。

此外,我发现不需要ToList()查询,因为BindingSource也会为您执行此操作。

非常感谢Jason Down让我走上正轨。

我在设置列宽时面临同样的问题。 经过大量的R&amp; D,我改变了下面的代码,工作正常。 代码:

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

其中 dgCustom dgCustom.DataSource.GetType()中的DataGrid ID。名称,它正常运行。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top