これは私の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);
上記のタイプのDataTableをバインドする方法を教えてください。
これは質問の要件に基づいた実用的なサンプルソリューションであり、 これらの回答
[〜#〜] 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; }
}
}
}
DataGrid.ItemsSource = DataTable.AsDataView();
言い換えれば、あなたはできる
yourDataGridInstance.AutoGenerateColumns = true;
yourDataGridInstance.ItemsSource = _simpleDataTable.AsDataView();
非WPFDataGridのソリューション:
//Create DataTable
DataTable dt = new DataTable();
//Put some columns in it.
dt.Columns.Add(new DataColumn("Item #", typeof(int)));
dt.Columns.Add(new DataColumn("Contract Number", typeof(string)));
dt.Columns.Add(new DataColumn("Customer Name", typeof(string)));
// Create the record
DataRow dr = dt.NewRow();
dr["Item #"] = i;
dr["Customer Name"] = xmn2[1].InnerText; //value from textbox on screen
dr["Contract Number"] = xmn4[1].InnerText; //value from textbox on screen
dt.Rows.Add(dr);
//Bind the GridView to the data in the data table for display.
this.GridView1.Visible = true;
GridView1.DataSource = dt;
GridView1.DataBind();
これを試して:
DataTable _simpleDataTable = new ataTable();
DataGridInstance.AutoGenerateColumns = true;
DataGridInstance.ItemsSource = _simpleDataTable.DefaultView;