如何在 UWP c# 中使用 DataTable 内容填充 DataGrid

Sam*_*vic 5 c# datatable datagrid uwp

我正在创建一个 UWP 应用程序并尝试使用包含我的数据库中的数据的 DataTable 填充我的 DataGrid,但没有成功。我已经搜索了解决方案,但无法摆脱错误。

XAML 代码:

<StackPanel>
    <Button Content="Fill DataGrid" Click="Button_Click"/>
    <controls:DataGrid x:Name="dataGrid"
                       Margin="30"
                       AutoGenerateColumns="True">
    </controls:DataGrid>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

C#代码:

    private static DataTable GetDataTable()
    {
        DataTable dt = new DataTable();

        dt.Columns.Add("ID", typeof(int));
        dt.Columns.Add("FirstName", typeof(string));
        dt.Columns.Add("LastName", typeof(string));
        dt.Columns.Add("Address", typeof(string));
        dt.Columns.Add("City", typeof(string));

        for (int i = 0; i < 10; i++)
            dt.Rows.Add(i, "text", "text", "text", "text");

        return dt;
    }

    private  void Button_Click(object sender, RoutedEventArgs e)
    {
        DataTable dt = GetDataTable();
        dataGrid.ItemsSource = dt.DefaultView; 
    }
Run Code Online (Sandbox Code Playgroud)

这是我用上面的代码得到的

并且此错误 20 次(该表有 10 个条目)

Error: BindingExpression path error: 'Item' property not found on 'System.Data.DataRowView'. BindingExpression: Path='Item' DataItem='System.Data.DataRowView'; target element is 'Windows.UI.Xaml.Controls.TextBlock' (Name='null'); target property is 'Text' (type 'String')
Run Code Online (Sandbox Code Playgroud)

当我用 DataContext 交换 ItemSource 时:

 dataGrid.DataContext = dt.DefaultView; 
Run Code Online (Sandbox Code Playgroud)

我没有收到任何错误,但我也没有以任何方式更改 dataGrid。

我尝试在 Windows 窗体中使用 DataGridView 做同样的事情,我成功了:

private void button_Click(object sender, EventArgs e)
{
    DataTable dt = GetDataTableFromDatabase();
    dataGridView1.DataSource = dt;
}
Run Code Online (Sandbox Code Playgroud)

我明白了,所以它不是数据库或数据表的问题。

在此处输入图片说明 我设法通过使用 DataTable 中的实体创建一个 List 并将它们作为源添加到 dataGrid 来实现解决方法,但问题是我有很多不同的 DataGrids,如果我能以某种方式它会容易得多以类似于 Windows 窗体中带有 dataGridView 的示例的方式解决问题。

任何帮助表示赞赏。

Sam*_*vic 7

多亏了这个网站,我才明白。

    public static void FillDataGrid(DataTable table, DataGrid grid)
    {
        grid.Columns.Clear();
        grid.AutoGenerateColumns = false;
        for (int i = 0; i < table.Columns.Count; i++)
        {
            grid.Columns.Add(new DataGridTextColumn()
            {
                Header = table.Columns[i].ColumnName,
                Binding = new Binding { Path = new PropertyPath("[" + i.ToString() + "]") }
            });
        }

        var collection = new ObservableCollection<object>();
        foreach (DataRow row in table.Rows)
        {
            collection.Add(row.ItemArray);
        }

        grid.ItemsSource = collection;
    }
Run Code Online (Sandbox Code Playgroud)

也许不是解决这个问题的最优雅的方法,但它确实有效,而且它完全符合我的要求。

并且您必须将 dataGrid 属性“AutoGenerateColums”设置为“False”。这给我带来了很多问题。