我想要一个消息框,让用户知道当他们取消选中复选框时,他们将丢失两个相关文本框中的值。问题是当用户点击“取消”时,再次出现消息框。如果用户单击取消,我希望复选框保持选中状态。
if (checkBox1.Checked == false)
{
checkBox2.Checked = false; checkBox3.Checked = false;
checkBox4.Checked = false; checkBox5.Checked = false;
checkBox6.Checked = false; checkBox7.Checked = false;
checkBox8.Checked = false;//Disable preceeding checkboxes
enableAllAssessmentsToolStripMenuItem.Checked = false;
}
if (checkBox1.Checked == true)
{
//Check if checkbox has been checked
textBox1.Enabled = true; textBox2.Enabled = true;//Enable that Line's Textboxes
}
else
{
//Or not
textBox1.Enabled = false; textBox2.Enabled = false;//Disable that Line's Textboxes
}
if(textBox1.Text.Length != 0 || textBox2.Text.Length != 0)
{
//If associated textboxes contain text
DialogResult Result1 = MessageBox.Show("The numbers you have input on this row will be lost", "Warning", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
if (Result1 == DialogResult.OK)
{
textBox1.Text = "";
textBox2.Text = "";
}
else if (Result1 == DialogResult.Cancel)
{
checkBox1.Checked = true;
}
}
答案 0 :(得分:2)
我相信您在CheckedChanged
的{{1}}处理程序中拥有此代码。如果未检查当前状态checkBox1
,则在用户取消消息框时更改其状态,并且您再次执行此处理程序。
如果订阅了handler,则在复选框状态发生变化时无法避免执行。但是你可以取消订阅处理程序:
checkBox1
或使用一些布尔标志来表示这种情况:
checkBox1.CheckedChanged -= checkBox1_CheckedChanged;
checkBox1.Checked = true;
checkBox1.CheckedChanged += checkBox1_CheckedChanged;
或者(可能更好的解决方案)你应该重新考虑你的逻辑。
我认为更好的解决方案是将此复选框void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if (shouldNotHandle)
return;
// ...
else if (Result1 == DialogResult.Cancel)
{
shouldNotHandle = true;
checkBox1.Checked = true;
shouldNotHandle = false;
}
}
设置为AutoCheck
并订阅false
事件而不是Click
。这将允许您根据条件手动更改复选框的状态:
CheckedChanged
我还将一些代码提取到其他方法中:
private void checkBox1_Click(object sender, EventArgs e)
{
checkBox1.Checked = !checkBox1.Checked;
if (textBox1.Text.Length != 0 || textBox2.Text.Length != 0)
{
if (UserConfirmedWarning("Numbers will be lost"))
{
textBox1.Text = "";
textBox2.Text = "";
}
else
{
checkBox1.Checked = true;
}
}
if (!checkBox1.Checked)
DisablePreceedingCheckboxes();
SetLineTextboxesEnabled(checkBox1.Checked);
}
答案 1 :(得分:2)
这很令人满意,因为当用户在消息框中单击Canclec时,您将Checked属性设置为true。这会再次触发CheckedChanged事件。
如果您需要选中此复选框,只需使用“flag”并在按下Cancel后将其设置为true以阻止事件被触发。
这样的事情:
if (flag) return;
if (checkBox1.Checked == false)
{
checkBox2.Checked = false; checkBox3.Checked = false;
checkBox4.Checked = false; checkBox5.Checked = false;
checkBox6.Checked = false; checkBox7.Checked = false;
checkBox8.Checked = false;//Disable preceeding checkboxes
enableAllAssessmentsToolStripMenuItem.Checked = false;
}
if (checkBox1.Checked == true)
{
//Check if checkbox has been checked
textBox1.Enabled = true; textBox2.Enabled = true;//Enable that Line's Textboxes
}
else
{
//Or not
textBox1.Enabled = false; textBox2.Enabled = false;//Disable that Line's Textboxes
}
if(textBox1.Text.Length != 0 || textBox2.Text.Length != 0)
{
//If associated textboxes contain text
DialogResult Result1 = MessageBox.Show("The numbers you have input on this row will be lost", "Warning", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
if (Result1 == DialogResult.OK)
{
textBox1.Text = "";
textBox2.Text = "";
}
else if (Result1 == DialogResult.Cancel)
{
flag = true;
checkBox1.Checked = true;
flag = false;
}
}
答案 2 :(得分:2)
由于你是在CheckChanged事件处理程序中调用的,并且这确实是你的逻辑所强加的,那么我将使用布尔变量作为标志来避免调用代码两次。
bool setFromHandler = false;
...
setFromHandler = true;
checkBox1.Checked = true;
...
if(setFromHandler)
{
...
}
else
{
...
}
干杯