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

8
我正在创建一个UWP应用程序,尝试使用从数据库获取的包含数据的DataTable填充我的DataGrid,但是没有成功。我已经搜索了解决方案,但就是无法摆脱错误。
XAML 代码:
<StackPanel>
    <Button Content="Fill DataGrid" Click="Button_Click"/>
    <controls:DataGrid x:Name="dataGrid"
                       Margin="30"
                       AutoGenerateColumns="True">
    </controls:DataGrid>
</StackPanel>

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; 
    }

This is what i get with the code above

并且这个错误出现了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')

当我将ItemSource和DataContext交换时:
 dataGrid.DataContext = dt.DefaultView; 

我没有收到任何错误,但是我也没有以任何方式改变数据表格。
我尝试在Windows表单中使用DataGridView做同样的事情,我成功了:
private void button_Click(object sender, EventArgs e)
{
    DataTable dt = GetDataTableFromDatabase();
    dataGridView1.DataSource = dt;
}

我理解了,这不是数据库或DataTable的问题。

enter image description here 我已经通过创建一个包含来自DataTable实体的列表并将它们添加为数据源到dataGrid来实现了解决方法,但问题是我有很多不同的DataGrids,如果我能以类似于Windows窗体中dataGridView的示例方式解决问题,那将会更容易。

任何帮助都将不胜感激。


我编辑了您的案例,但是使用上述代码很难复现问题。您能否分享一个小样本? - Nico Zhu
@NicoZhu-MSFT,我稍微修改了代码,这个示例展示了相同的行为。 - Samed Bejtovic
2个回答

11

多亏了这个网站,我弄清楚了。

    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;
    }

也许这不是最优雅的解决方式,但它有效,并且完全符合我的要求。

而且你必须将dataGrid属性"AutoGenerateColums"设置为"False"。 这给我带来了很多问题。


你在xaml页面上声明ObservableCollection的位置在哪里?我无法使用列项模板,因为它一直显示没有ObservableCollection。我搜索了一些相关内容,但是从代码后台绑定时如何实现还没有完全理解。谢谢。 - user1544428

0

我不知道这是否是更好的答案,但当我发现这个问题时,我已经接近解决了。我习惯于使用Asp.Net,所以这就是我想出来的。

在xaml页面(或使用)xmlns:controls="using:Microsoft.Toolkit.Uwp.UI.Controls"

nModel.Data.ListData = 一个类文件。

 public class ListData
{
    public string HashId { get; set; }
    public int SortOrder { get; set; }
    public string StrSortOrder { get; set; }
    public string DataPoint { get; set; }
    public string Rfid { get; set; }
    public string Description { get; set; }
    public string Attch { get; set; }
}

而在页面的代码后台:

   DataTable dt = new DataTable();
        dt = nModel.DataDAL.ListData.ListDataDataTable("30039");

        List<nModel.Data.ListData> dataList = new List<nModel.Data.ListData>();
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            nModel.Data.ListData ListData = new nModel.Data.ListData();
            ListData.StrSortOrder = dt.Rows[i]["SortOrder"].ToString();
            ListData.DataPoint = dt.Rows[i]["DataPoint"].ToString();
            ListData.Rfid = dt.Rows[i]["Rfid"].ToString();
            dataList.Add(ListData);
        }
       
        dataGrid.ItemsSource = dataList;

还有网格

<controls:DataGrid x:Name="dataGrid"
                       AutoGenerateColumns="False">
        <controls:DataGrid.Columns>
            <controls:DataGridTextColumn Header="Piece#"
                                         Binding="{Binding StrSortOrder}"/>
            <controls:DataGridTextColumn Header="SerialNo"
                                         Binding="{Binding DataPoint}"/>
            <controls:DataGridTextColumn Header="Rfid"
                                         Binding="{Binding Rfid}"/>
            
        </controls:DataGrid.Columns>
        </controls:DataGrid>

学习了几天uwp后,很明显为什么没有人使用DataTables。

GridView和ListView控件与Asp.Net版本完全不同。甚至不清楚DataGrid控件是否存在。当我回到这个问题并深入挖掘时,我有些沮丧。

感谢您的提问...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接