Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How Bind DataTable to DataGrid

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.

like image 451
Priyantha1986 Avatar asked Jul 24 '11 16:07

Priyantha1986


People also ask

What is DataGridView data binding?

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.

How do I bind data to grid in xamarin form?

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.

Which properties are used to bind a DataGridView control?

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.


2 Answers

DataGrid.ItemsSource = DataTable.AsDataView();

or in other words you can do

yourDataGridInstance.AutoGenerateColumns = true;
yourDataGridInstance.ItemsSource = _simpleDataTable.AsDataView();
like image 85
Haris Hasan Avatar answered Oct 20 '22 23:10

Haris Hasan


This is a working sample solution based on the requirements in the question and these answers

MainWindow

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

Person.cs

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

Student.cs

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; }
        }
    }
}
like image 30
WiiMaxx Avatar answered Oct 20 '22 22:10

WiiMaxx