win UI 3 - Load DataGrid from DataTable

Charlie S 31 Reputation points
2022-05-14T17:59:52.5+00:00

Need some help getting DataTable data to display in a DataGrid. The code below works fine if I create a WPF app. When I run it in WinUI 3, I get "system.Data.DataView", etc, as seen in the screenshot following the code.

Any thoughts?

My xaml:

    <Window  
        x:Class="SampleWINUIDataGrid.MainWindow"  
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
        xmlns:controls="using:CommunityToolkit.WinUI.UI.Controls"  
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"  
        xmlns:local="using:SampleWINUIDataGrid"  
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"  
        mc:Ignorable="d">  
      
        <StackPanel Margin="20" HorizontalAlignment="Left">  
            <controls:DataGrid x:Name="myDataGrid" AutoGenerateColumns="True" />  
        </StackPanel>  
      
    </Window>  

My code behind:

using Microsoft.UI.Xaml;  
using System.Data;  
  
namespace SampleWINUIDataGrid  
{  
    public sealed partial class MainWindow : Window  
    {  
        public DataTable MyDataTable { get; set; }  
        public MainWindow()  
        {  
            this.InitializeComponent();  
  
            MyDataTable = new DataTable("table");  
              
            MyDataTable.Columns.Add("name");  
            MyDataTable.Columns.Add("age");  
  
            MyDataTable.Rows.Add("aaa", "11");  
            MyDataTable.Rows.Add("bbb", "22");  
            MyDataTable.Rows.Add("ccc", "33");  
  
            myDataGrid.ItemsSource = MyDataTable.DefaultView;  
        }  
    }  
}  

My results:

201965-123.png

Windows development | Windows App SDK
{count} votes

2 answers

Sort by: Most helpful
  1. Castorix31 91,506 Reputation points
    2022-05-16T14:36:31.533+00:00

    Another method by adding columns/data dynamically from your DataTable (with AutoGenerateColumns="False") =>

    <controls:DataGrid x:Name="myDataGrid" AutoGenerateColumns="False" VerticalAlignment="Top" Margin="10, 20, 0, 0" />  
    

    then

      public DataTable MyDataTable { get; set; }  
    

    and (add the "less than" character before object (editor bug...))

                MyDataTable.Columns.Add("Name");  
                MyDataTable.Columns.Add("Age");  
      
                MyDataTable.Rows.Add("aaa", "11");  
                MyDataTable.Rows.Add("bbb", "22");  
                MyDataTable.Rows.Add("ccc", "33");  
    
                for (int i = 0; i < MyDataTable.Columns.Count; i++)  
                {  
                    myDataGrid.Columns.Add(new CommunityToolkit.WinUI.UI.Controls.DataGridTextColumn()  
                    {  
                        Header = MyDataTable.Columns[i].ColumnName,  
                        Binding = new Binding { Path = new PropertyPath("[" + i.ToString() + "]") }  
                    });  
                }  
    
    
    
                var collectionObjects = new System.Collections.ObjectModel.ObservableCollection object>();  
                foreach (DataRow row in MyDataTable.Rows)  
                {  
                    collectionObjects.Add(row.ItemArray);  
                }  
                myDataGrid.ItemsSource = collectionObjects;  
                
    

    202297-winui3-datagrid2.gif

    3 people found this answer helpful.

  2. Castorix31 91,506 Reputation points
    2022-05-14T20:34:01.853+00:00

    You can use x:Bind with a Collection

      <controls:DataGrid x:Name="myDataGrid" AutoGenerateColumns="True" Margin="10, 20, 0, 0"  
                               ItemsSource="{x:Bind MyData}">  
    

    with :

            public class MyDataClass  
            {  
                public String Name { get; set; }  
                public int Age { get; set; }  
      
                public MyDataClass(String Name, int Age)  
                {  
                    this.Name = Name;  
                    this.Age = Age;    
                }  
            }  
              
            System.Collections.ObjectModel.ObservableCollection<MyDataClass> MyData = new System.Collections.ObjectModel.ObservableCollection<MyDataClass>();  
    

    Test click Button :

            private void myButton_Click(object sender, RoutedEventArgs e)  
            {   
                MyData.Add(new MyDataClass("aaa", 11));  
                MyData.Add(new MyDataClass("bbb", 22));  
                MyData.Add(new MyDataClass("ccc", 33));  
            }  
    

    201993-winui3-datagrid.gif

    2 people found this answer helpful.

Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.