This is my DataTable.
DataTable _simpleDataTable = new ataTable();
var person = new DataColumn("Person") {DataType = typeof (Person)};
_simpleDataTable.Columns.Add(person);
var student = new DataColumn("Student") {DataType = typeof (Student)};
_simpleDataTable.Columns.Add(student);
var dr1 = _simpleDataTable.NewRow();
dr1[0] = new Person {PersonId = 1, PersonName = "TONY"};
dr1[1] = new Student { StudentId = 1, StudentName = "TONY" };
_simpleDataTable.Rows.Add(dr1);
var dr2 = _simpleDataTable.NewRow();
dr2[0] = new Person { PersonId = 2, PersonName = "MAL" };
dr2[1] = new Student { StudentId = 2, StudentName = "MAL" };
_simpleDataTable.Rows.Add(dr2);
Plaase tell me how to bind above type of DataTable.
The DataGridView control supports the standard Windows Forms data binding model, so it can bind to a variety of data sources. Usually, you bind to a BindingSource that manages the interaction with the data source.
Binding ItemsSource in XAML In the main page, add the necessary XML namespace to use SfDataGrid control, set the BindingContext of the page to the ViewModel class, and bind the ItemSource of SfDataGrid with the DataTableCollection.
Binding Data to the Control. For the DataGrid control to work, it should be bound to a data source using the DataSource and DataMember properties at design time or the SetDataBinding method at run time.
DataGrid.ItemsSource = DataTable.AsDataView();
or in other words you can do
yourDataGridInstance.AutoGenerateColumns = true;
yourDataGridInstance.ItemsSource = _simpleDataTable.AsDataView();
This is a working sample solution based on the requirements in the question and these answers
XAML
<Window x:Class="HowBindDataTableToDataGrid.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<!-- you need foreach class one DataTemplate-->
<DataTemplate x:Key="PersonDataTemplate" DataType="Person">
<StackPanel>
<TextBlock Background="LightBlue" Text="{Binding PersonId}"/>
<TextBlock Background="AliceBlue" Text="{Binding PersonName}"/>
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="StudentDataTemplate" DataType="Student">
<StackPanel>
<TextBlock Background="Orange" Text="{Binding StudentId}"/>
<TextBlock Background="Yellow" Text="{Binding StudentName}"/>
</StackPanel>
</DataTemplate>
</Window.Resources>
<Grid>
<DataGrid Name="simpleDataGrid" AutoGeneratingColumn="simpleDataGrid_AutoGeneratingColumn" />
</Grid>
</Window>
.CS
using System.Data;
using System.Windows;
using System.Windows.Data;
using System.Windows.Controls;
namespace HowBindDataTableToDataGrid
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
simpleDataGrid.ItemsSource = LoadDataTable().AsDataView();
}
private void simpleDataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (e.PropertyType == typeof(Person))
{
MyDataGridTemplateColumn col = new MyDataGridTemplateColumn();
col.ColumnName = e.PropertyName;
col.CellTemplate = (DataTemplate)FindResource("PersonDataTemplate");
e.Column = col;
e.Column.Header = e.PropertyName;
}
else if (e.PropertyType == typeof(Student))
{
MyDataGridTemplateColumn col = new MyDataGridTemplateColumn();
col.ColumnName = e.PropertyName;
col.CellTemplate = (DataTemplate)FindResource("StudentDataTemplate");
e.Column = col;
e.Column.Header = e.PropertyName;
}
}
private DataTable LoadDataTable()
{
var _simpleDataTable = new DataTable();
var person = new DataColumn("Person") { DataType = typeof(Person) };
_simpleDataTable.Columns.Add(person);
var student = new DataColumn("Student") { DataType = typeof(Student) };
_simpleDataTable.Columns.Add(student);
var dr1 = _simpleDataTable.NewRow();
dr1[0] = new Person { PersonId = 1, PersonName = "TONY" };
dr1[1] = new Student { StudentId = 1, StudentName = "TONY" };
_simpleDataTable.Rows.Add(dr1);
var dr2 = _simpleDataTable.NewRow();
dr2[0] = new Person { PersonId = 2, PersonName = "MAL" };
dr2[1] = new Student { StudentId = 2, StudentName = "MAL" };
_simpleDataTable.Rows.Add(dr2);
return _simpleDataTable;
}
}
public class MyDataGridTemplateColumn : DataGridTemplateColumn
{
public string ColumnName { get; set; }
protected override System.Windows.FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
{
// The DataGridTemplateColumn uses ContentPresenter with your DataTemplate.
ContentPresenter cp = (ContentPresenter)base.GenerateElement(cell, dataItem);
// Reset the Binding to the specific column. The default binding is to the DataRowView.
BindingOperations.SetBinding(cp, ContentPresenter.ContentProperty, new Binding(this.ColumnName));
return cp;
}
}
}
namespace HowBindDataTableToDataGrid
{
public class Person
{
private int personId;
private string personName;
public int PersonId
{
get { return personId; }
set { personId = value; }
}
public string PersonName
{
get { return personName; }
set { personName = value; }
}
}
}
namespace HowBindDataTableToDataGrid
{
public class Student
{
private int personId;
private string personName;
public int StudentId
{
get { return personId; }
set { personId = value; }
}
public string StudentName
{
get { return personName; }
set { personName = value; }
}
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With