我正在使用用于管理学生公寓的管理界面的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;
}
答案 0 :(得分:0)
如果我是你,我会做几件事:
<!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语句中的代码永远不会执行。
我真的相信这不是随机的,而是由于复杂的逻辑导致的时序问题。