当前位置:  开发笔记 > Android > 正文

什么是带有点的DataTable列名,使它们不适合WPF的DataGrid控件?

如何解决《什么是带有点的DataTable列名,使它们不适合WPF的DataGrid控件?》经验,为你挑选了2个好方法。

运行这个,并混淆:


    
        
        
        
        
    

代码隐藏:

using System.Data;
using System.Windows;

namespace Data_Grids
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            DataTable dt1, dt2;
            dt1 = new DataTable();
            dt2 = new DataTable();
            dt1.Columns.Add("a-name", typeof(string));
            dt1.Columns.Add("b-name", typeof(string));
            dt1.Rows.Add(new object[] { 1, "Hi" });
            dt1.Rows.Add(new object[] { 2, "Hi" });
            dt1.Rows.Add(new object[] { 3, "Hi" });
            dt1.Rows.Add(new object[] { 4, "Hi" });
            dt1.Rows.Add(new object[] { 5, "Hi" });
            dt1.Rows.Add(new object[] { 6, "Hi" });
            dt1.Rows.Add(new object[] { 7, "Hi" });
            dt2.Columns.Add("a.name", typeof(string));
            dt2.Columns.Add("b.name", typeof(string));
            dt2.Rows.Add(new object[] { 1, "Hi" });
            dt2.Rows.Add(new object[] { 2, "Hi" });
            dt2.Rows.Add(new object[] { 3, "Hi" });
            dt2.Rows.Add(new object[] { 4, "Hi" });
            dt2.Rows.Add(new object[] { 5, "Hi" });
            dt2.Rows.Add(new object[] { 6, "Hi" });
            dt2.Rows.Add(new object[] { 7, "Hi" });
            r1.DataContext = dt1;
            r2.DataContext = dt2;
        }
    }
}

我会告诉你会发生什么.顶部数据网格填充了列标题和数据.底部数据网格具有列标题,但所有行都是空白的.



1> 小智..:

您可以将AutoGenerateColumns设置为true并添加一个事件处理程序来处理任何句点(或其他特殊字符):

    
    

代码隐藏:

private void r2_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    if (e.PropertyName.Contains('.') && e.Column is DataGridBoundColumn)
    {
        DataGridBoundColumn dataGridBoundColumn = e.Column as DataGridBoundColumn;
        dataGridBoundColumn.Binding = new Binding("[" + e.PropertyName + "]");
    }
}

在MVVM场景中,这对我来说效果更好.



2> bstoney..:

绑定路径解析器错误地解释第二个表的列名中的句点符号.在此示例运行时查看调试输出,您可以看到自动生成的列已绑定到'a'和'b'而不是'a.name'和'b.name'

System.Windows.Data Error: 40 : BindingExpression path error: 'a' property not found on 'object' ''DataRowView' ... etc.
System.Windows.Data Error: 40 : BindingExpression path error: 'b' property not found on 'object' ''DataRowView' ... etc.

在绑定路径中有许多不同的字符具有特殊含义,包括句号('.'),斜线('/'),方括号('[',']')和括号('(',') )'),括号将导致您的应用程序崩溃.可以通过使用方括号包围绑定路径来转义这些特殊字符.有关路径和字符转义的更多信息,请参阅绑定声明概述

要解决此问题,您必须设置AutoGenerateColumns ="False"并在xaml中指定列绑定:

    
        
            
            
        
    

或以编程方式在后面的代码中

        r2.AutoGenerateColumns = false;
        foreach( DataColumn column in dt2.Columns )
        {
            var gridColumn = new DataGridTextColumn()
            {
                Header = column.ColumnName,
                Binding = new Binding( "[" + column.ColumnName + "]" )
            };

            r2.Columns.Add( gridColumn );
        }

        r2.DataContext = dt2;

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有