我有两张表,employees
在project
中listbox2
,我展示了所有的employees
和listbox1
所有的projects
,现在显然一名员工可以参与许多项目,而一个项目可能有很多员工。所以我有这个EmployeeProject
映射存在的多对多关系。我想要的是,如果用户单击第一个列表框中的项目名称,则该项目中的所有员工都应在列表框2 中选择。此外,当用户单击 listbox2 中的项目时,(员工)应在 listbox1 中选择该员工所属的所有项目
但是,如果我在此过程中使用 ListBox.SelectedIndexChanged 事件,并在 listbox2 中选择一个值,那么它将触发 listbox2 的 SelectedIndexChagned,这将通过选择当前员工所属的 listbox1 中的所有项目开始工作,但又一次,只要 listbox1 中的一个项目被选中,它就会触发它的 SelectedIndexChanged 事件,并且它会像这样永远持续下去。那么这有什么解决办法呢?到目前为止,我已经做到了这一点..
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
// Load the list of employees
cmd.CommandText =
"SELECT EmpName FROM Employee WHERE EmpID IN(SELECT EmpID FROM EmployeeProject WHERE ProjectID =(SELECT ProjectID FROM Project WHERE ProjectName = '" +
listBox1.SelectedItem.ToString() + "')) ORDER BY EmpId";
var rdr = cmd.ExecuteReader();
listBox2.Items.Clear();
// right now, I am doing this to escape this recursive loop, but thats not what I want
while (rdr.Read())
{
listBox2.Items.Add(rdr.GetString(0));
}
rdr.Close();
this.AutoScroll = true;
}
private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
{
// Load the list of projects
cmd.CommandText =
"SELECT ProjectName FROM Projects WHERE ProjectID IN(SELECT ProjectID FROM EmployeeProject WHERE EmpId=(SELECT EmpId FROM Employee WHERE EmpName= '" +
listBox2.SelectedItem.ToString() + "')) ORDER BY ProjectID";
var rdr = cmd.ExecuteReader();
listBox1.Items.Clear();
// again, I don't want to clear, but select all those employee in listbox1 that are involved in this selected project, but can't do it because it would cause infinite recursion of these
while (rdr.Read())
{
listBox2.Items.Add(rdr.GetString(0));
}
rdr.Close();
this.AutoScroll = true;
}
所以?我应该怎么做才能达到我想要达到的目的?我将如何避免这种递归?我知道这种方式也适用于我刚刚展示的内容,但我不想清理并再次出现(这可能会使简单的用户感到困惑)。我希望对于每个选择,在其他列表框中选择与该选择相对应的值(当然不会导致递归!)。我该怎么做?
编辑我不知道如何以编程方式在列表框中选择多个项目,所以如果你能说出来,那就太好了!