首页 > 解决方案 > 表单之间的 C# 通信错误

问题描述

我正在开发用于管理学生综合体的管理界面的 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 中的静态规则列表中,将来自 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 是否为真(在关闭 form2 之前设置)。在 if 语句中,我们清除列表框并将 ruleList(之前在 form2 中编辑)中的每个规则添加到列表框,然后将 formOpen 设置为 false,这样它就不会一直执行:

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

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

lbRules.Items.Add(item);

在 foreach 循环中,因此它会在每个项目上停止。我实际上看到更改的规则从规则列表添加到列表框中,但最后它不存在。奇怪的是,我还尝试在 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;

我不会在代码中的其他任何地方为这个整数赋值。我真的试着挖掘一些意义,但我撞到了一块坚硬的石头。任何帮助表示赞赏!并感谢您的时间!

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

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;

        }

标签: c#debugging

解决方案


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

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

使用formOpen = false;外部if语句的问题在于,一旦用户单击“保存”按钮,计时器可能即将执行 formOpen = false 指令,将其设置为 false,从而使 If 语句中的代码永远不会被执行。

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


推荐阅读