C# DataGrid动态-绑定/加载
我在C WPF中有一个DataGrid,我想以一种有组织的方式列出数据,但问题是动态绑定列加载很难处理,因为我的类需要一个动态字段名 代码 问题: 如上所述,我的类中似乎需要一个与用户指定名称同名的字段名。是否有一种方法可以创建一个名为benefit.getName的字符串字段?如果不是,那么绑定是基于字段名这一事实如何解决呢C# DataGrid动态-绑定/加载,c#,wpf,datagrid,C#,Wpf,Datagrid,我在C WPF中有一个DataGrid,我想以一种有组织的方式列出数据,但问题是动态绑定列加载很难处理,因为我的类需要一个动态字段名 代码 问题: 如上所述,我的类中似乎需要一个与用户指定名称同名的字段名。是否有一种方法可以创建一个名为benefit.getName的字符串字段?如果不是,那么绑定是基于字段名这一事实如何解决呢 每个员工都可以享受多项福利您可以这样做吗 public EmployeeDataGrid_BiWeek(string fromData, string until
每个员工都可以享受多项福利您可以这样做吗
public EmployeeDataGrid_BiWeek(string fromData, string untilDate, Benefit[] selectedBenefits, Employee[] selectedEmployees)
{
InitializeComponent();
string[] benefit_name = new string[selectedBenefits.count()];
int count = 0;
foreach (Benefit benefit in selectedBenefits)
{
var col = new DataGridTextColumn();
col.Header = benefit.getName();
benefit_name[count] = benefit.getName();
col.Binding = new Binding(benefit.getName());
// ^^ the above binding is based on the field name
mainDataGrid.Columns.Add(col);
count++;
}
foreach (Employee emp in selectedEmployees)
{
BigEmpGridItem item = new BiEmpGridItem(emp);
int x = ????; // The number of the benefit for this employee
item.BenefitName = benefit_name[x];
mainDataGrid.Items.Add(item);
}
}
public class BiEmpGridItem {
public string Name { get;set; }
public string Birthday { get; set;}
public string BenefitName {get; set;} // add this
public BiEmpGridItem(Employee ee)
{
this.Name = ee.lastName + ", " + ee.firstName;
this.Birthday = ee.getDateOfBirth();
}
}
}
使用列表说明每位员工的多项福利:
public void EmployeeDataGrid_BiWeek(string fromData, string untilDate, Benefit[] selectedBenefits, Employee[] selectedEmployees)
{
InitializeComponent();
List<string> benefit_names = new List<string>();
int count = 0;
// Get this employees selected benefits
foreach (Benefit benefit in selectedBenefits)
{
var col = new DataGridTextColumn();
col.Header = benefit.getName();
benefit_names.Add(benefit.getName());
col.Binding = new Binding(benefit.getName());
// ^^ the above binding is based on the field name
mainDataGrid.Columns.Add(col);
count++;
}
// Create the grid
foreach (Employee emp in selectedEmployees)
{
BiEmpGridItem item = new BiEmpGridItem(emp);
item.BenefitName = benefit_names;
mainDataGrid.Items.Add(item);
}
}
public class BiEmpGridItem
{
public string Name { get;set; }
public string Birthday { get; set;}
public List<string> BenefitName {get; set;} // add this
public BiEmpGridItem(Employee ee)
{
this.Name = ee.lastName + ", " + ee.firstName;
this.Birthday = ee.getDateOfBirth();
}
}
所以我必须找到一种动态绑定数据的方法,或者至少一行一行地插入数据 最终放弃了对象绑定的想法,使用了dataTable,下面是其他人的代码
List<string> dates = new List<string>();
DataTable dt = new DataTable();
dt.Columns.Add("Name");
dt.Columns.Add("BirthDate");
foreach (String s in company.payDays)
{
DateTime compd = DateTime.Parse(s);
if (compd > startDate && compd < endDate)
{
dates.Add(s);
dt.Columns.Add(s);
}
}
foreach (Employee emp in selectedEmployees)
{
var row = dt.NewRow();
row["Name"] = emp.getLastName() + ", " + emp.getFirstName();
row["BirthDate"] = emp.getDateOfBirth();
dt.Rows.Add(row);
}
mainDataGrid.AutoGenerateColumns = true;
mainDataGrid.DataContext = dt.DefaultView;
<DataGrid x:Name="mainDataGrid" DockPanel.Dock="Bottom" ItemsSource="{Binding}" IsReadOnly="True" ClipboardCopyMode="IncludeHeader">
如果您查看绑定构造函数,您将看到参数名为path,而不是name。考虑到这一点,如果您放置了某种称为let say Benefits的列表属性,那么您可以使用Benefits[i]作为绑定路径
例如:
XAML
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication1"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<DockPanel>
<DataGrid x:Name="dataGrid" DockPanel.Dock="Top"/>
</DockPanel>
</Window>
代码隐藏
using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
namespace WpfApplication1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var selectedBenefits = Enumerable.Range(1, 10).Select(n => new Benefit { Name = "Benefit" + n }).ToArray();
var selectedEmployees = Enumerable.Range(1, 20).Select(n => new Employee
{
firstName = "FirstName" + n,
lastName = "LastName" + n,
dateOfBirth = "DateOfBirth" + n,
benefits = selectedBenefits.Select((b, i) => "B[" + n + ", " + i + "]").ToArray()
}).ToArray();
dataGrid.AutoGenerateColumns = false;
dataGrid.Columns.Add(new DataGridTextColumn { Header = "Name", Binding = new Binding("Name") });
dataGrid.Columns.Add(new DataGridTextColumn { Header = "Birthday", Binding = new Binding("Birthday") });
for (int i = 0; i < selectedBenefits.Length; i++)
dataGrid.Columns.Add(new DataGridTextColumn { Header = selectedBenefits[i].getName(), Binding = new Binding("Benefits[" + i + "]") });
foreach (var emp in selectedEmployees)
dataGrid.Items.Add(new BiEmpGridItem(emp));
}
}
public class Benefit
{
public string Name { get; set; }
public string getName() { return Name; }
}
public class Employee
{
public string firstName, lastName;
public string dateOfBirth;
public string getDateOfBirth() { return dateOfBirth; }
public string[] benefits;
}
public class BiEmpGridItem
{
public string Name { get; set; }
public string Birthday { get; set; }
public string[] Benefits { get; private set; }
public string GetBenefit(int index) { return Benefits[index]; }
public BiEmpGridItem(Employee ee)
{
this.Name = ee.lastName + ", " + ee.firstName;
this.Birthday = ee.getDateOfBirth();
this.Benefits = ee.benefits;
}
}
}
结果
每个员工都有多个好处在这种情况下,您可以使用列表吗?
using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
namespace WpfApplication1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var selectedBenefits = Enumerable.Range(1, 10).Select(n => new Benefit { Name = "Benefit" + n }).ToArray();
var selectedEmployees = Enumerable.Range(1, 20).Select(n => new Employee
{
firstName = "FirstName" + n,
lastName = "LastName" + n,
dateOfBirth = "DateOfBirth" + n,
benefits = selectedBenefits.Select((b, i) => "B[" + n + ", " + i + "]").ToArray()
}).ToArray();
dataGrid.AutoGenerateColumns = false;
dataGrid.Columns.Add(new DataGridTextColumn { Header = "Name", Binding = new Binding("Name") });
dataGrid.Columns.Add(new DataGridTextColumn { Header = "Birthday", Binding = new Binding("Birthday") });
for (int i = 0; i < selectedBenefits.Length; i++)
dataGrid.Columns.Add(new DataGridTextColumn { Header = selectedBenefits[i].getName(), Binding = new Binding("Benefits[" + i + "]") });
foreach (var emp in selectedEmployees)
dataGrid.Items.Add(new BiEmpGridItem(emp));
}
}
public class Benefit
{
public string Name { get; set; }
public string getName() { return Name; }
}
public class Employee
{
public string firstName, lastName;
public string dateOfBirth;
public string getDateOfBirth() { return dateOfBirth; }
public string[] benefits;
}
public class BiEmpGridItem
{
public string Name { get; set; }
public string Birthday { get; set; }
public string[] Benefits { get; private set; }
public string GetBenefit(int index) { return Benefits[index]; }
public BiEmpGridItem(Employee ee)
{
this.Name = ee.lastName + ", " + ee.firstName;
this.Birthday = ee.getDateOfBirth();
this.Benefits = ee.benefits;
}
}
}