Я работаю с приложением WinForm, которое имеет две формы. Первая форма - это основная форма со всей логикой. Вторая форма содержит элемент управления браузера и обращается к внутренней веб-странице на основе данных, переданных из формы Form1. Затем с веб-страницей можно будет взаимодействовать. Проблема возникает, когда MessageBox появляется на Form1, взаимодействие блокируется на Form2.
Есть ли способ включить взаимодействие с Form2 до ответа на MessageBox?
OpenBrowser(docIDs, txtID.Text)
Me.Activate()
resultYESNO = MessageBox.Show(Me, questionText, "Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
If resultYESNO = DialogResult.Yes Then
columnValue = "Y"
ElseIf resultYESNO = DialogResult.No Then
columnValue = "N"
End If
Подпрограмма OpenBrowser:
Private Sub OpenBrowser(ByVal docIDs As List(Of String), ByVal ID As String)
If Not Application.OpenForms().OfType(Of Browser).Any Then
Dim browser = New Browser()
End If
Dim encodeIDs As String
encodeIDs = String.Join(",", docIDs.ToArray())
Dim barray As Byte() = System.Text.Encoding.UTF8.GetBytes(encodeIDs)
Dim encodedIDs = System.Convert.ToBase64String(barray)
Dim url = ConfigurationManager.AppSettings("MyBrowserPath")
Browser.WebBrowser1.Url = New Uri(url & encodedIDs)
Dim area = Screen.PrimaryScreen.WorkingArea
Dim width = CInt(area.Width / 2)
Dim height = CInt(area.Height)
Browser.Width = width
Browser.Height = 800
Browser.SetDesktopLocation(width, 0)
Browser.Show()
Browser.BringToFront()
Browser.Activate()
End Sub
Речь шла о попытке заменить диалоговое окно «фальшивым» диалогом. Здесь нужен другой подход.
Тогда почему вы открываете форму браузера, прежде чем задать вопрос?
Перед тем, как ответить на вопрос, необходимо просмотреть данные в веб-форме.
Давным-давно в далекой-далекой галактике вы могли установить модальность старого MsgBox. Теперь единственный выбор - ApplicationModal.
В следующем примере показано, как можно создавать разные потоки пользовательского интерфейса и показывать разные формы в разных потоках. Тогда модальные диалоговые формы являются модальными в потоке, который их создал:
Imports System.Threading
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
For i = 1 To 2
Dim index = i
Dim t = New Thread(
Sub()
Dim f = New Form With {.Text = $"Form {index}"}
Dim b = New Button With {.Text = "Click Me."}
AddHandler b.Click,
Sub()
Using d As New Form()
d.StartPosition = FormStartPosition.CenterParent
d.Size = New Drawing.Size(100, 100)
d.ShowDialog()
End Using
End Sub
f.Controls.Add(b)
Application.Run(f)
End Sub)
t.SetApartmentState(ApartmentState.STA)
t.IsBackground=True
t.Start()
Next
End Sub
End Class
Разве мы не спрашивали об этом вчера?