c# - 如何阻止方法递归调用自己?

标签 c# visual-studio recursion listbox

我有两个表,employeesproject,在 listbox2 中,我显示了所有的 employees 并且在listbox1 所有的projects,现在显然一个员工可以参与多个项目,一个项目可以有多个员工。所以我有这个 EmployeeProject 映射存在的多对多关系。我想要的是,如果用户单击第一个列表框中的项目名称,则应在 listbox2 中选择该项目中的所有员工。此外,当用户单击 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;
        }

所以呢?我应该怎么做才能达到我想要达到的目的?我将如何避免这种递归?我知道这种方式也适用于我刚刚展示的内容,但我不想清理并再次出现(这可能会使普通用户感到困惑)。我希望对于每个选择,在其他列表框中选择与该选择对应的值(当然不会导致递归!)。我该怎么做?

编辑 我不知道如何以编程方式选择列表框中的多个项目,所以如果你能说出来,那就太好了!

最佳答案

有一种设计模式叫做Balking,我觉得它适用于这里。

http://en.wikipedia.org/wiki/Balking_pattern

思路是引入一个辅助状态变量来控制运行:

  private bool doesProcessing { get; set; }

  private void listBox1_SelectedIndexChanging( ... )
  {
     // signal the beginning of processing
     if ( doesProcessing ) 
        return;
     else
        doesProcessing = true; 

     try
     {
        // your logic goes here
     }
     finally
     {
        // signal the end of processing
        doesProcessing = false;
     }
  }

对于 listBox2 也是如此。

关于c# - 如何阻止方法递归调用自己?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11139674/

相关文章:

c# - 在 Visual Studio 中更改 SQL Server 数据库最大大小以便在 Azure 中上传

c# - VS2022配置Azure keyvault看不到本地secrets.json

java - 数独求解器的算法复杂度 (Big-O)

c# - 使用 1 :1 relationship 更新 EF 中的实体

c# - 在 asp.net c# 中使用下拉列表

visual-studio - Visual Studio 未加载我的调试器可视化工具

java - 当 "n"的值较大时,递归函数运行时间过长

python - 为什么我的递归不起作用?警告 : Project Euler spoiler

c# - 检测应用程序是否在系统帐户下运行?

c# - 如何从 silverlight 应用程序调用 Web api