Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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# 在类(员工职务)上创建双向关系列表属性_C#_.net - Fatal编程技术网

C# 在类(员工职务)上创建双向关系列表属性

C# 在类(员工职务)上创建双向关系列表属性,c#,.net,C#,.net,目前我有两个班,一个是员工班,另一个是工作班 Job有一个绑定的员工列表,两者都是INotifyPropertyChanged的子类 在此阶段,员工还拥有一份具有约束力的工作列表 每次创建作业时,我都会向其中添加员工的。然后,我为这些员工添加了工作 这就是事情变成梨形的地方,情况变得无限递归 似乎每个对象都有一个占用率的绑定列表是错误的。也许我应该传递一些参考信息,比如在员工的工作列表中,我可以传递他们的名字,反之亦然 欢迎提出任何建议 这是我当前的代码:(注意:这个版本试图使用AddingNe

目前我有两个班,一个是员工班,另一个是工作班

Job有一个绑定的员工列表,两者都是INotifyPropertyChanged的子类

在此阶段,员工还拥有一份具有约束力的工作列表

每次创建作业时,我都会向其中添加员工的。然后,我为这些员工添加了工作

这就是事情变成梨形的地方,情况变得无限递归

似乎每个对象都有一个占用率的绑定列表是错误的。也许我应该传递一些参考信息,比如在员工的工作列表中,我可以传递他们的名字,反之亦然

欢迎提出任何建议

这是我当前的代码:(注意:这个版本试图使用AddingNew事件。我认为我做得不对)

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统组件模型;
名称空间分配\u 3
{
公共类员工:INotifyPropertyChanged
{
静态只读对象_object=新对象();
私有字符串名称;
私有字符串返回字符串;
私人职业;;
私有十进制率;
私有绑定列表employeeJobs;
公共事件AddingNewEventHandler属性已更改;
公共绑定列表employeeJobs
{
得到
{
返回员工工作岗位;
}
设置
{
employeeJobs=价值;
makeJobList();
}
}
public void makeJobList()
{
//PropertyChanged(作业列表,新的PropertyChangedEventArgs(“作业列表”));
returnString_=“”;
foreach(员工职位中的当前职位职位)
returnString_u892;+=currentJob.jobNumber.ToString()+“,”;
}
公共雇员(BindingList employeeJobs、字符串名称、职业、十进制比率)
{
employeeJobs=employeeJobs;
employeeJobs\uu.AddingNew+=新的AddingNewEventHandler(employeeJobs\uu列表已更改);
姓名=姓名;
职业=职业;
比率=比率;
makeJobList();
}
私有void employeeJobs\uuu列表已更改(对象发送方,AddingNewEventArgs e)
{
if(PropertyChanged!=null)
{
财产变更(本,e);
}
makeJobList();
}
公共字符串名
{
得到
{
返回名称;
}
设置
{
名称=值;
}
}
公共职业
{
得到
{
返回占领区;
}
设置
{
职业=价值;
}
}
公共十进制率
{
得到
{
回报率;
}
设置
{
速率=值;
}
}
公共字符串作业列表
{
得到
{
makeJobList();
返回字符串;
}
}
}
}
工作代码基本相同

private void createNewEmployeeButton__Click(object sender, EventArgs e)
{
    BindingList<Job> selectedJobs = ExtensionMethods.MakeBinding<Job>(jobsForNewEmployeeBox_.SelectedRows);
    MessageBox.Show(selectedJobs.Count.ToString());
    Employee newJoe = new Employee(selectedJobs, nameTextBox.Text, (Occupation)occupationComboBox.SelectedItem, rateNumericUpDown.Value);

    foreach (Job job in selectedJobs)
    {
        job.employees.Add(newJoe);
        job.makeEmployeeList();
    }

    employeeList_.Add(newJoe);
    this.Close();
}
private void createNewEmployeeButton\u单击(对象发送者,事件参数e)
{
BindingList selectedJobs=ExtensionMethods.MakeBinding(jobsForNewEmployeeBox_uz.SelectedRows);
Show(selectedJobs.Count.ToString());
Employee newJoe=新员工(selectedJobs,nameTextBox.Text,(职业)occupationComboBox.SelectedItem,rateNumericUpDown.Value);
foreach(选定作业中的作业)
{
job.employees.Add(newJoe);
job.makeEmployeeList();
}
员工名单添加(newJoe);
这个。关闭();
}

为什么不考虑与它自己的类的关系呢?您将只有一个列表,而不是工作中的员工列表实例,反之亦然。这一个列表永远不会失去同步—当您在所有作业和员工对象上都有单独的列表时,您不可避免地会遇到这个问题

员工工作分配类 此类包含对员工和作业对象的引用,并描述它们之间的关系

EmployeeJobAssignmentCollection类 此类将
可观察列表
发布为属性,并提供允许更改已注册关系的方法,例如:

  • SetEmployeeJobs(员工,工作集合):删除员工的所有工作分配并添加新工作分配
  • SetJobEmployees(作业,员工集合):删除作业的所有工作分配并添加新工作分配
当然,您可以定义其他方法,例如AddEmployeeToJob,它只声明存在特定的关系,并在需要时添加它

类发布的
ObservableList
断言,其他类可以注册以在关系发生更改时收到通知

员工/职务类别 实例化员工或作业对象时,会将EmployeeJobAssignmentCollection对象的引用传递给它。新实例化的对象订阅
ObservableCollection
的CollectionChanged事件。通过这种方式,他们将收到有关更改的通知

这些类分别保留其Jobs或Employee的集合属性,并要求EmployeeAssignmentCollection根据其自己的id返回相关对象。
一旦对象被告知关系发生了变化,它们也会发出信号,表示其工作或员工集合发生了变化。为了避免不必要的事件,您可能需要实现一种机制来验证更改是否与特定员工或工作相关。
更新:以向
private void createNewEmployeeButton__Click(object sender, EventArgs e)
{
    BindingList<Job> selectedJobs = ExtensionMethods.MakeBinding<Job>(jobsForNewEmployeeBox_.SelectedRows);
    MessageBox.Show(selectedJobs.Count.ToString());
    Employee newJoe = new Employee(selectedJobs, nameTextBox.Text, (Occupation)occupationComboBox.SelectedItem, rateNumericUpDown.Value);

    foreach (Job job in selectedJobs)
    {
        job.employees.Add(newJoe);
        job.makeEmployeeList();
    }

    employeeList_.Add(newJoe);
    this.Close();
}