我的应用程序中有一个表单,用户可以在其中输入序列号列表,每个序列号都要进行快速检查,然后添加到列表中(这是针对库存模块)。因此,用户通常使用条形码扫描仪扫描一堆库存物品中的序列号。
我正在处理用户正在扫描项目并查找KeyPress
(输入键)时具有焦点的TextBox
e.KeyChar == 13
事件。每当按下输入时,我知道我有一个完整的序列号,然后我可以在将其添加到列表之前进行验证。
这是我的问题发生的地方;在某些情况下,我必须在此时提示用户是否确实要将库存项目添加到列表中。我正在使用MessageBox
,就像这样:
if (MessageBox.Show("This is a special stock item.\r\nDo you want to add it to the list?", "Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
// Add item to list
else
// Do not add item to list
但是因为这只是偶尔发生的事情,用户通常甚至都看不到MessageBox
并且只是扫描下一个序列号,当然会丢失,但会以输入键结束,这会触发MessageBox
上的默认按钮,并且没有打算这样做,有时甚至不知道它发生了,用户将一个项目添加到列表中并错过了后续项目。
有没有办法可以阻止MessageBox
在按下输入时触发任何按钮?我不介意用户是否在条形码后继续扫描条形码并丢失所有按钮,只要MessageBox
保持在屏幕上,直到他意识到他的注意力是必需的,并故意选择两个选项中的一个。
答案 0 :(得分:2)
有没有办法阻止MessageBox触发任何按钮 输入是按下了吗?
没有
我不介意用户在条形码和条码后继续扫描条形码 只要MessageBox保留在屏幕上直到他,他们都会丢失 意识到他的注意力是必需的,故意选择其中之一 两个选项。
使用YesNoCancel
选项,并将默认值设置为Button3
,这将是Cancel
按钮。现在保持循环,结果是Cancel
。当循环退出时,用户将选择Yes
或No
:
DialogResult result;
do
{
result = MessageBox.Show("This is a special stock item.\r\nDo you want to add it to the list?", "Confirmation", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button3);
} while (result == DialogResult.Cancel);
if (result == DialogResult.Yes)
{
// yes
}
else
{
// no
}
----------编辑----------
我并不过分喜欢在对话框上设置按钮的想法 除了一些模糊的应用逻辑(来自 用户的观点)。
同意......拥有" noop"按钮不是最佳的。上面的解决方案是一个快速而肮脏的解决方案"。
当你开始实现自己的自定义MessageBox表单时,只要按钮当前聚焦,就可以轻松地忽略Enter键:
public partial class frmVerify : Form
{
public frmVerify()
{
InitializeComponent();
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == Keys.Enter && this.ActiveControl is Button)
{
return true; // suppress the keystroke
}
return base.ProcessCmdKey(ref msg, keyData);
}
// ... more code ...
}