C# - Enable/Disable 基于文本框值的 MenuStrip 项
C# - Enable/Disable MenuStrip Item Based On TextBox Value
我试图在显示文本框时禁用某些菜单条项目 "Calculating..."。一旦该值消失,我希望重新启用菜单项。它的目的不是中断MD5/CRC32计算。到目前为止,我已经尝试了各种代码方法,但到目前为止还没有运气。下面列出的 应该 有效,但由于某些原因它没有。任何帮助将不胜感激。
// THIS PART WORKS
if (boxMD5.Text.Contains("Calculating") == true)
{
openROMToolStripMenuItem.Enabled = false;
saveROMDataToolStripMenuItem.Enabled = false;
asTXTToolStripMenuItem.Enabled = false;
asHTMLToolStripMenuItem.Enabled = false;
}
// THIS PART DOES NOT WORK
else if (boxMD5.Text.Contains("Calculating") == false)
{
openROMToolStripMenuItem.Enabled = true;
saveROMDataToolStripMenuItem.Enabled = true;
asTXTToolStripMenuItem.Enabled = true;
asHTMLToolStripMenuItem.Enabled = true;
}
我不能完全告诉您为什么代码没有达到您的预期,但我可以提出一个建议,这将改变您的方法,同时可能有助于实现您的目标。您要做的不应该是在文本框包含 "Calculating"
时禁用菜单,而是应该在执行计算时禁用菜单。从 user/UI 的角度来看,这些是同一件事,但您的程序的内部工作原理更清楚。
根据您的 PasteBin 代码,试试这个:
private void openROMToolStripMenuItem_Click(object sender, EventArgs e)
{
//Other code omitted for brevity
if (File.Exists(OpenFileDialog1.FileName))
{
UpdateUI("Calculating...");
backgroundWorker1.RunWorkerAsync(OpenFileDialog1.FileName);
}
//Other code omitted for brevity
}
和
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
UpdateUI(e.Result.ToString());
}
新方法 UpdateUI()
如下所示:
void UpdateUI(string hash)
{
var calculating = hash == "Calculating...";
if (!calculating)
{
progressBar1.Value = 0;
}
openROMToolStripMenuItem.Enabled = !calculating;
saveROMDataToolStripMenuItem.Enabled = !calculating;
asTXTToolStripMenuItem.Enabled = !calculating;
asHTMLToolStripMenuItem.Enabled = !calculating;
boxMD5.Text = hash;
}
此外,请注意如何在 if 语句中只放置 !calculating
而不是 calculating == false
。这是因为该值已经是 true
或 false
,因此您无需将其与任何内容进行比较即可确定。同样的事情适用于您的原始代码,但您不再需要使用这种方法。
我试图在显示文本框时禁用某些菜单条项目 "Calculating..."。一旦该值消失,我希望重新启用菜单项。它的目的不是中断MD5/CRC32计算。到目前为止,我已经尝试了各种代码方法,但到目前为止还没有运气。下面列出的 应该 有效,但由于某些原因它没有。任何帮助将不胜感激。
// THIS PART WORKS
if (boxMD5.Text.Contains("Calculating") == true)
{
openROMToolStripMenuItem.Enabled = false;
saveROMDataToolStripMenuItem.Enabled = false;
asTXTToolStripMenuItem.Enabled = false;
asHTMLToolStripMenuItem.Enabled = false;
}
// THIS PART DOES NOT WORK
else if (boxMD5.Text.Contains("Calculating") == false)
{
openROMToolStripMenuItem.Enabled = true;
saveROMDataToolStripMenuItem.Enabled = true;
asTXTToolStripMenuItem.Enabled = true;
asHTMLToolStripMenuItem.Enabled = true;
}
我不能完全告诉您为什么代码没有达到您的预期,但我可以提出一个建议,这将改变您的方法,同时可能有助于实现您的目标。您要做的不应该是在文本框包含 "Calculating"
时禁用菜单,而是应该在执行计算时禁用菜单。从 user/UI 的角度来看,这些是同一件事,但您的程序的内部工作原理更清楚。
根据您的 PasteBin 代码,试试这个:
private void openROMToolStripMenuItem_Click(object sender, EventArgs e)
{
//Other code omitted for brevity
if (File.Exists(OpenFileDialog1.FileName))
{
UpdateUI("Calculating...");
backgroundWorker1.RunWorkerAsync(OpenFileDialog1.FileName);
}
//Other code omitted for brevity
}
和
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
UpdateUI(e.Result.ToString());
}
新方法 UpdateUI()
如下所示:
void UpdateUI(string hash)
{
var calculating = hash == "Calculating...";
if (!calculating)
{
progressBar1.Value = 0;
}
openROMToolStripMenuItem.Enabled = !calculating;
saveROMDataToolStripMenuItem.Enabled = !calculating;
asTXTToolStripMenuItem.Enabled = !calculating;
asHTMLToolStripMenuItem.Enabled = !calculating;
boxMD5.Text = hash;
}
此外,请注意如何在 if 语句中只放置 !calculating
而不是 calculating == false
。这是因为该值已经是 true
或 false
,因此您无需将其与任何内容进行比较即可确定。同样的事情适用于您的原始代码,但您不再需要使用这种方法。