Сохранение MessageBox в VB.net

Я использую MessageBox, чтобы предоставить некоторую информацию пользователю, но когда появляется такое окно, я хочу, чтобы оно блокировало доступ к главному окну. Таким образом, пока пользователь не нажмет «ОК», он не сможет щелкнуть (или даже сфокусироваться) на окне, которое находится под ним.

Кто-нибудь знает, как это сделать? Я заметил, что у MessageBox очень мало функций, поэтому, возможно, мне даже придется использовать для этого другой объект.


person Neko    schedule 30.05.2011    source источник
comment
О, сразу после того, как я написал здесь, мой друг придумал ответ. При вызове MessageBox.Show(mf, "text"), где mf — главная форма, mf будет отключена, пока не будет нажата кнопка OK. Я полагаю, что этот вопрос было немного глупо публиковать в конце концов, но я надеюсь, что это может помочь другим, если они столкнулись с той же проблемой.   -  person Neko    schedule 31.05.2011
comment
Есть много подобных вопросов (например, stackoverflow.com/questions/1154181/ ), чтобы вы могли удалить наш вопрос, если получили ответ или считаете, что он может помочь другим, опубликуйте решение как ответ и примите его.   -  person Bala R    schedule 31.05.2011
comment
Это уже так работает. Если вы не укажете владельца, он будет искать его. Если он найдет неправильный, это должно быть очень необычно, это происходит только тогда, когда вы отображаете окно сообщения в потоке. Который должен вызвать InvalidOperationException с подключенным отладчиком, чтобы напомнить вам, что вы делаете это неправильно.   -  person Hans Passant    schedule 31.05.2011


Ответы (2)


Быстрым и грязным решением может быть диалоговая форма (Проект->Добавить форму Windows->Диалог). Это дает вам визуальную расширяемость вашего MessageBox.

Вы можете вызвать метод ShowDialog вашего MessageBox, и он, конечно, заблокирует доступ к родительскому окну.

Есть, конечно, и другие методы.

Пример:

' This is your Dialog you created by going Project->Add Windows Form->Dialog
Public Class MessageBoxDialog

  Public Overloads Sub ShowDialog(ByVal message As String)

    Me.txtMessage.Text = message

    ShowDialog()

  End Sub
End Class

' This is the form you want to call the message box on
Private Sub btnShowMsgBox_Click(sender As System.Object, e As System.EventArgs) _
                                Handles btnShowMsgBox.Click
    Dim messageBox As New MessageBoxDialog
    messageBox.ShowDialog("This is another way to show a MsgBox but allows greater extensibility.")
End Sub
person Jeremy    schedule 31.05.2011
comment
@Downvoter объясните, что не так с быстрым и грязным решением для уже быстрого и грязного вызова MessageBox? - person Jeremy; 31.05.2011
comment
Я не против, но тот факт, что это никоим образом не мешает пользователю взаимодействовать с другими формами и, следовательно, не является решением проблемы OP, кажется вероятным... - person jmoreno; 31.05.2011
comment
@jmoreno: Скажи что? Кажется, что оператор путают с тем, как работает msgbox, но это приемлемая альтернатива запрошенной функциональности msgbox. Обратите внимание, что оператор спрашивал не о других формах, а о родителях. Может, я что-то пропустил? - person Maxim Gershkovich; 31.05.2011
comment
@Максим, нет, это я что-то пропустил. Итак, я не знаю, почему отрицательный голос. - person jmoreno; 31.05.2011

Сразу после того, как я написал здесь, мой друг придумал ответ. При вызове MessageBox.Show(mf, "text"), где mf является основной формой, mf будет отключен, пока не будет нажата кнопка OK. Я полагаю, что этот вопрос было немного глупо публиковать в конце концов, но я надеюсь, что это может помочь другим, если они столкнулись с той же проблемой.

person Neko    schedule 31.01.2012