c# - 表单之间的 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;
}
解决方案
我会将您的代码更改为以下内容:
if (formOpen)
{
formOpen = false;
lbRules.Items.Clear();
foreach (string item in ruleList)
lbRules.Items.Add(item);
}
使用formOpen = false;
外部if
语句的问题在于,一旦用户单击“保存”按钮,计时器可能即将执行 formOpen = false 指令,将其设置为 false,从而使 If 语句中的代码永远不会被执行。
我真的相信这不是随机的,而是由于复杂的逻辑而导致的时间问题。
推荐阅读
- sql-server - 消除来自左连接而不是销售表的计数?
- go - pgxpool 的 config.AfterRelease 没有触发
- reactjs - React Native useState 在 watchPositionAsync 内部不起作用
- python - 根据包含另一列中的多个类别值的一列值拆分数据框
- ios - SwiftUI:如何在导航视图中“深度链接”到列表的第二/第三级
- flutter - 连接到 GRPC 服务器时发生 SocketConnectException
- javascript - 如何从数组中找到唯一值?
- javascript - 在我的 Leaflet.JS 地图中调整弹出窗口的大小问题
- html - CSS Grid 需要在所有边上都是 100% 的宽度和高度
- android - 当我在 Kotlin 的底部导航中使用它时,我的改造应用程序正在检索错误