Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataGrid动态-绑定/加载_C#_Wpf_Datagrid - Fatal编程技术网

C# DataGrid动态-绑定/加载

C# DataGrid动态-绑定/加载,c#,wpf,datagrid,C#,Wpf,Datagrid,我在C WPF中有一个DataGrid,我想以一种有组织的方式列出数据,但问题是动态绑定列加载很难处理,因为我的类需要一个动态字段名 代码 问题: 如上所述,我的类中似乎需要一个与用户指定名称同名的字段名。是否有一种方法可以创建一个名为benefit.getName的字符串字段?如果不是,那么绑定是基于字段名这一事实如何解决呢 每个员工都可以享受多项福利您可以这样做吗 public EmployeeDataGrid_BiWeek(string fromData, string until

我在C WPF中有一个DataGrid,我想以一种有组织的方式列出数据,但问题是动态绑定列加载很难处理,因为我的类需要一个动态字段名

代码

问题:

如上所述,我的类中似乎需要一个与用户指定名称同名的字段名。是否有一种方法可以创建一个名为benefit.getName的字符串字段?如果不是,那么绑定是基于字段名这一事实如何解决呢


每个员工都可以享受多项福利

您可以这样做吗

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