Выделите элемент управления в отключенной форме, используя отражение в VB.Net для любой выбранной сборки.

Я использую Reflection with VB.Net, чтобы получить все формы в списке и все элементы управления в другом списке для выбранной формы в первом списке для любой выбранной сборки из любого места.

При выборе любой формы и нажатии кнопки «Открыть форму» эта конкретная форма открывается в отключенном состоянии.

Но он выдает исключение, поскольку соединение не может быть установлено (кажется, событие загрузки формы все еще срабатывает, что нежелательно).

Итак, теперь я хочу, чтобы форма загружалась в отключенном состоянии без запуска каких-либо событий, а также, если какой-либо элемент управления будет выбран, он будет выделен в форме красной рамкой.

Может ли кто-нибудь помочь мне в этом отношении?


person Smruti Ranjan Sahoo    schedule 23.12.2011    source источник
comment
Вы не можете предотвратить срабатывание события Load. Я бы порекомендовал вам использовать более практичный и удобный пользовательский интерфейс, создание отключенных окон не имеет особого смысла.   -  person Hans Passant    schedule 23.12.2011


Ответы (2)


При открытии формы используйте

Dim f1 as new [Form name]

Ex:

Dim f1 as new Form1
person SL H4CK3R    schedule 25.12.2011

Не открывайте форму. Просто создайте его, а затем вы сможете прокручивать коллекцию Controls.

Dim frm = New Form1()
For Each ctl As Control In frm.Controls
    Console.WriteLine(ctl.Name)
Next

РЕДАКТИРОВАТЬ:

Чтобы иметь возможность открывать форму без выполнения обработчика события Form Load, добавьте в форму следующий код:

Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    If Enabled Then
        ' Put your loading code here
        MsgBox("Form_Load")
    End If
End Sub

Я не знаю, возможно ли это сделать в вашем случае; однако я не вижу другой возможности.


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

Dim frm As Form
Dim redBorder As Button

Private Sub ControllerForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    ' Create another form.
    ' (You would do that with Reflection after selecting a form name from a listbox)
    frm = New FormWithControls()

    ' Get the control names and fill the controls listbox
    For Each ctrl As Control In frm.Controls
        ListBox1.Items.Add(ctrl.Name)
    Next

    'Disable and display the form
    frm.Enabled = False
    frm.Show()

    'Create a red border and add it to the other form
    redBorder = New Button()
    redBorder.FlatAppearance.BorderColor = System.Drawing.Color.Red
    redBorder.FlatAppearance.BorderSize = 2
    redBorder.FlatStyle = System.Windows.Forms.FlatStyle.Flat
    frm.Controls.Add(redBorder)
    redBorder.SendToBack()
    redBorder.Visible = False

    ' Get the focus back to this form
    Me.Focus()
End Sub

Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
    ' Get the selected control
    Dim ctrl = frm.Controls(ListBox1.SelectedItem.ToString())

    ' Position and size the red border
    Dim rect = ctrl.Bounds
    rect.Inflate(2, 2)
    redBorder.Bounds = rect
    redBorder.Visible = True
End Sub
person Olivier Jacot-Descombes    schedule 23.12.2011
comment
На самом деле мое требование состоит в том, чтобы показать конкретное для, и когда я попытаюсь выбрать конкретное имя элемента управления в списке списка, он должен выделить этот конкретный элемент управления в новой форме, обведя его красной рамкой.... - person Smruti Ranjan Sahoo; 20.01.2012