2015-09-16 6 views
0

У меня есть форма в моем приложении, где пользователи могут вводить список серийных номеров, каждый из которых должен быть подвергнут быстрой проверке, а затем добавлен в список (это для модуля ввода акций). Поэтому пользователи обычно используют сканеры штрих-кодов для сканирования серийных номеров из кучи предметов запаса.MessageBox без кнопки по умолчанию

Я обрабатываю событие KeyPressTextBox, у которого есть фокус, пока пользователи просматривают элементы и ищут 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 остается на экране, пока он не осознает, что его внимание требуется и намеренно выбирает один из двух вариантов.

+4

Нет, вы можете достаточно быстро написать собственное сообщение коробка. Встроенный блок сообщений - это ограниченный инструмент, предназначенный для быстрого удобства, но в нем нет всего. –

+0

вам нужно создать свое собственное окно сообщений и убедиться, что оно является Модальным .. так, чтобы он оставался на переднем крае, если это окна .. то это то, что можно сделать довольно легко .. – MethodMan

ответ

2

Есть ли способ, которым я могу запретить MessageBox запускать любые кнопки, если нажата кнопка ?

No.

Я не возражаю, если пользователь зайдет на сканирование штрих-кода после штрих-кода и потерять их всех, до тех пор, как 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 

     } 

---------- ---------- Edit

Я не слишком люблю идею наличия кнопки в диалоговом окне, что ничего не значит, кроме какой-то неясной логики приложения (с точки зрения пользователя ).

Согласен ... с кнопкой «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 ... 

} 
+0

Умная идея. Благодарю. Я не слишком люблю идею наличия кнопки в диалоге, что означает ничего, кроме какой-то неясной логики приложения (с точки зрения пользователя). Как бы то ни было, я принимаю этот ответ, поскольку это простое и изящное решение. Это то, что я сейчас буду делать, а позже я мог бы реализовать свой собственный MessageBox. –

Смежные вопросы