表单之间的C#通信错误

时间:2019-12-10 00:24:12

标签: c# debugging

我正在使用用于管理学生公寓的管理界面的GUI。当前,GUI具有一个列表框,其中包含用于学生的预定义6条规则。在代码的开头,我将它们添加到列表中

private void Form1_Load(object sender, EventArgs e)
        {
            foreach (string rule in lbRules.Items)
                ruleList.Add(rule);
        }

然后,GUI为管理员提供了修改规则的选项。为此,他从列表框中选择一个规则,然后单击“修改”按钮,这将打开另一个表单:

private void BtnModify_Click(object sender, EventArgs e)
        {
            if (lbRules.SelectedItems.Count > 0)
            {
                selectedRule = lbRules.SelectedItem.ToString();
                selectedIndex = lbRules.SelectedIndex;
                selectedRuleNumber = selectedRule.Substring(0, 3);
                selectedRule = selectedRule.Substring(6);
                var rulesForm = new Rules();
                rulesForm.Show();
            }

        }

在第二个表单加载事件中,我获得了规则的文本和数字:

 private void Rules_Load(object sender, EventArgs e)
        {
            tbRule.Text = Form1.selectedRuleNumber;
            tbModifyRule.Text = Form1.selectedRule;
        }

文本将添加到RichTextBox中,可以在其中编辑规则。 然后,管理员单击“保存”按钮,该按钮将从RichTextBox(tbModifyRule)中获取编辑后的文本,并将其添加到form1的静态ruleList中,并将静态布尔值从form1设置为true。然后第二种形式关闭:

 private void BtnSave_Click(object sender, EventArgs e)
        {
            saveRule = Form1.selectedRuleNumber + " - " + tbModifyRule.Text;
            Form1.ruleList.Insert(Form1.selectedIndex, saveRule);
            Form1.ruleList.RemoveAt(Form1.selectedIndex+1);
            Form1.formOpen = true;
            this.Dispose();
        }

至此,我们返回到form1,其中有一个带有timer_tick事件的计时器。在这里,我们检查布尔值formOpen是否为true(在关闭form2之前设置的布尔值)。在if语句内部,我们清除列表框,并将RuleList(先前在form2中编辑过)的每个规则添加到列表框,然后将formOpen设置回false,这样就不会一直执行:

if (formOpen)
{
    lbRules.Items.Clear();
    foreach (string item in ruleList)
        lbRules.Items.Add(item);
}
formOpen = false;

现在这真的很奇怪,这时对我来说绝对没有意义,因为我尝试调试了一个多小时,尝试了不同的方式,这也使我产生了为什么永远可以工作的神秘奇迹想要... 因此,这是随机的,就像第一次,第二次和第三次都不会。或相反亦然。都是随机的。 奇怪的是,我尝试在

上添加一个断点
lbRules.Items.Add(item);

在foreach循环中,因此它在每个项目上停止。实际上,我看到更改后的规则已从ruleList添加到listBox中,但最后却不存在。 奇怪的是,我也尝试在不使用列表的情况下在form1的listBox中添加来自form2的文本,但是出于某种奇怪的原因,我使用了int selectedIndex,它从BtnModify_Click事件获取所选项目的索引以插入特定索引中的文本,但是在form2关闭后,该索引被随机设置为血腥0。 因此,它有时会再次起作用,因为在某些尝试下,它并没有设置为0并起作用。

if (formOpen)
            {
                selectedRule = Rules.saveRule;
                lbRules.Items.Insert(selectedIndex, selectedRule);
                lbRules.Items.RemoveAt(selectedIndex+1);
            }
            formOpen = false;

在代码中的其他地方,我都不给该整数赋值。 我确实确实尝试了某种意义上的挖掘,但是我遇到了坚如磐石的难题。 任何帮助表示赞赏! 并感谢您的宝贵时间!

edit1: 根据要求-计时器方法的其余部分

private void Timer1_Tick(object sender, EventArgs e)
        {
            foreach (string text in ws.messages)
                message = text;

            if (ws.messages.Count > 0)
            {
                if (message.Contains("comp"))
                {

                    Complaints();
                    message = String.Empty;
                    ws.messages.Clear();
                }
            }

            if (formOpen)
            {   
                lbRules.Items.Clear();
                foreach (string item in ruleList)
                    lbRules.Items.Add(item);
            }
            formOpen = false;

        }

2 个答案:

答案 0 :(得分:0)

如果我是你,我会做几件事:

  1. 使用单独的类在表单之间进行数据交换,避免为此使用公共静态(我假设)表单成员。
  2. 而不是计时器,订阅<!DOCTYPE html> <html lang="en"> <head> <title>Bootstrap Example</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"></script> <link href="https://fonts.googleapis.com/css?family=Lora:400,700|Montserrat:300" rel="stylesheet"> <script src="script.js"></script> <title>MyCar</title> </head> <body> <nav class="navbar navbar-expand-lg navbar-light bg-light"> <a class="navbar-brand" href="index.php">MyCar</a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false"> <span class="navbar-toggler-icon"></span> </button> <div class="navbar-collapse collapse" id="navbarSupportedContent"> <ul class="navbar-nav mr-auto mt-2 mt-lg-0"> <li class="nav-item"> <a class="nav-link active" href="#">Home </a> </li> <li class="nav-item"> <a class="nav-link" href="cars.php">Search Cars </a> </li> <li class="nav-item "> <a class="nav-link" href="sell.php">Sell Cars </a> </li> <li class="nav-item "> <a class="nav-link" href="financing.php">Financing </a> </li> </ul> <ul class="navbar-nav mt-2 mt-lg-0"> <?php if(isset($_SESSION['username'])){ echo '<li class="nav-item"> <a class="nav-link" href="profile.php">Welcome, '.$_SESSION['username'].'<span class="sr-only">(current)</span></a> </li> <li class="nav-item"> <a class="nav-link" href="?logout=true">Log Out</a> </li>' ; } else { echo '<li class="nav-item"> <a class="nav-link" href="signup.php">Sign Up <span class="sr-only">(current)</span></a> </li> <li class="nav-item"> <a class="nav-link" href="login.php">Log In</a> </li>'; } ?> <!--<li class="nav-item"> <a class="nav-link" href='?logout=true'>>Log Out</a> </li> --> </ul> </div> </nav> </body> </html>的{​​{1}}事件

这可以使代码流更具可预测性,并使您更容易发现错误。

更好的是,使用以下模式:

Form.Closed
RulesForm
class Form1
{
   private void BtnModify_Click(object sender, EventArgs e)
   {
      var ruleData = ..... //get current rule data
      var rulesForm = new Rules();
      rulesForm.SetData(ruleData); //pass initial state to the form
      rulesForm.SaveChanges = this.ApplyRules; //pass a method which will be called on save
      rulesForm.Show();
   }

   private bool ApplyRules(RuleData ruleData)
   {
       //do whatever you like with the rules here
       return true;
   }
}

答案 1 :(得分:0)

我会将您的代码更改为以下内容:

if (formOpen)
{   
  formOpen = false;
  lbRules.Items.Clear();
  foreach (string item in ruleList)
      lbRules.Items.Add(item);
}

formOpen = false;语句之外放置if的问题是,一旦用户单击“保存”按钮,计时器就有可能执行formOpen = false指令,将其设置为假使If语句中的代码永远不会执行。

我真的相信这不是随机的,而是由于复杂的逻辑导致的时序问题。