Member 10628309 Ответов: 2

Как я могу получить большие пользовательских элементов управления, чтобы запустить один из его подпрограмм из события формы form1 вниз


Я узнал, что события keydown не работают в пользовательских элементах управления (из опыта и чтения десятков сообщений). Поэтому я добавил код Ctrl + P keydown в код Form1.vb, и он реагирует так, как ожидалось. Моя проблема заключается в том, как я могу отправить событие Ctrl + P в usercontrol, чтобы он запустил одну из своих многочисленных подпрограмм. Я попробовал приведенный ниже код и множество его вариаций, но, похоже, между кодом Form1 и UserControl нет никакой связи.

В обозревателе решений отображается на форме form1.VB и пользовательских элементов управления.ВБ на таком же уровне в рамках проекта. Расширения пользовательских элементов управления в окне Обозреватель решений, очень похоже на форму form1.расширение глаг. Я пытаюсь подчеркнуть, что UserControl является сложным и имеет примерно такое же количество подпрограмм, как и Form1.vb.

Я бы показал скриншот обозревателя решений, но я не знаю, как это сделать с CodeProject.

Что я уже пробовал:

Public Sub PKey_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
        If e.KeyData = (Keys.Control Or Keys.P) Then
            Dim UC1 As New Yacht_Race.UserControl1
            UC1.myPrint()
        End If
    End Sub

2 Ответов

Рейтинг:
6

Member 10628309

Этот код работает отлично. Он исключил 20 строк кода Else If и предотвратил редактирование нескольких сотен строк кода со многими именами UserControl, например UserControl112.

Public Sub PKey_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
        If e.KeyData = (Keys.Control Or Keys.P) Then
            Dim Ctrl As Control = Me.ActiveControl
            DirectCast(Ctrl, UserControl1).myPrint()
        End If
    End Sub


phil.o

Теперь что произойдет, если вы нажмете на элемент управления, который не имеет myPrint() метод?

Ralf Meier

В дополнение к комментарию от Phil.O :
Объект как тип может быть всем, а также принимает все как назначение.
Чтобы сделать этот фрагмент кода правильно, вы должны каждый раз проверять, является ли Me.ActiveControl правильным типом.
Далее : вызов метода объекта, который не принадлежит объектному типу, вызовет (не может вызвать) множество будущих проблем, которые нелегко обнаружить с помощью отладчика.
Я предлагаю вам внимательно прочитать то, что OriginalGriff написал внутри другого решения ... и... прочитайте (только немного) о типах и обработке типов ...

Member 10628309

Thank you for your advice. When I seek advice on this web site I do not include code that I use to prevent a problem, e.g., try catch etc. I am always trying to make something work. After I get it working then I go back and look for problems. Yes, there have been several times that I had to scrap what I was trying to do and do a different way. But in the process I learn a lot. With regard to your comment about using Object...someone else gave me a similar comment and suggested that I use Dim Ctrl As Control = Me.ActiveControl followed by DirectCast(Ctrl, UserCtrl).myPrint(). What I didn't mention in my origional question was that I have 8 Identical UserControls on 8 tabs of a 12 tab TabControl. I was trying to write code that would work on any of the 8 tabs/usercontrols numbered UserControl110, 111, 112...117.

Ralf Meier

Я не совсем понимаю, что вы там делаете ... но :
Обычно действие происходит из элемента управления (в данном случае вашего UserControl), а не из формы хостинга.
Лучше всего было бы так : вы поднимаете и событие с вами UserControl и ловите его на хостинговой форме. Здесь вы можете решить, что должно произойти дальше.

К вашей проблеме :
Если вы делаете только некоторые тесты, вы можете (не должны) создавать некоторый "быстрый и грязный" код. Но если вы создаете что-то, что должно работать в этой области, вы должны использовать хорошо протестированный код (методы, элементы управления и т. д.), Чтобы предотвратить дальнейшие проблемы. Но это твоя игра, а не моя ...

Ralf Meier

Дополнительный :
Перед приведением вы должны проверить (с помощью GetType , Type), действительно ли типы элементов управления совпадают. Только в этом случае вы должны использовать литье ... но в этом случае вам это не нужно делать, потому что типы smae могут быть назначены друг другу (напрямую) ...

Рейтинг:
0

OriginalGriff

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

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

Но... У меня не было никаких проблем с событиями Keydown в UserControls - они прекрасно работают с любым элементом управления, имеющим фокус пользователя (который, очевидно, является единственным, который может принимать ввод с клавиатуры, например текстовые поля)


Member 10628309

Я думаю, вы предполагаете, что если я удалю строку кода: Dim UC1 как New Yacht_Race.UserControl1 и измените следующую строку с UC1.myPrint() на myPrint() Что это сработает...Я могу заверить вас, что это не работает. Если я не понимаю, что вы предлагаете, пожалуйста, попробуйте еще раз, чтобы я понял. Может быть, пара строк кода поможет.

OriginalGriff

Нет, прочтите, что я сказал: "Если вы вызываете метод myPrint на экземпляре элемента управления, который отображается в вашей форме"
Это означает именно то, что он говорит: вам нужно использовать имя экземпляра элемента управления, которое появляется в свойстве Name на панели свойств в конструкторе форм Visual Studio.
Посмотрите, сможете ли вы его найти - просто откройте конструктор и щелкните элемент управления, чтобы выделить его.

Member 10628309

Имя элемента управления-UserControl1. Именно это показано в разделе "свойство Name панели свойств в конструкторе форм Visual Studio". Помните, что код ключа вниз находится в файле Form1.vb. Он каким-то образом должен сообщить об этом событии элементу управления UserControl1.

OriginalGriff

Так что же, по-твоему, тебе нужно сделать с этим именем? Ну же, это совсем не сложно!

Member 10628309

UserControl1.myPrint() этого не делает work...it даже не будет компилироваться. Тем временем я прочитал еще по меньшей мере 50 постов и убежден, что то, что я пытаюсь сделать, не может быть сделано. Я уверен, что вы скажете мне вернуться в школу и научиться чему-нибудь, но я не позволю этому расстроить меня.

OriginalGriff

:вздыхать:
Так... "UserControl1" - это имя класса элемента управления, так как оно появляется в панели инструментов Visual studio точно так же, как и "TextBox" или "Button".
Но когда вы перетаскиваете кнопку на свою форму, она не называется "кнопка" в вашем коде, не так ли? Нет - это называется butOK или cancelButton, или buttonThatTheUserPressesToCloseMyapp, или ... что-то, что отличает его от всех других кнопок на вашей форме.

И если вы внимательно посмотрите на панель свойств, когда эта кнопка выделена, вы увидите свойство "Name", которое содержит текст "butOK" или "cancelButton", или "buttonThatTheUserPressesToCloseMyapp", чтобы вы знали, с каким из них вы работаете.

Поэтому выделите свой элемент управления UserControl на форме в конструкторе и посмотрите на свойство "Name". Что там написано? Я просто предполагаю здесь, но я не думаю, что это будет то же самое, что и название класса ...

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

Member 10628309

Я уверен, что вы полностью возмущены, но вы непреднамеренно определили проблему. Имя класса-UserControl1, а имя элемента управления-также UserControl1. Я не знаю, насколько сложно переименовать класс или элемент управления, но если это можно сделать, то я думаю, что проблема разрешима.

OriginalGriff

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

Откройте форму в конструкторе.
Выделите экземпляр элемента управления.
Найдите свойство "имя" на панели свойств.
Нажмите на фактическое имя.
Введите новое имя.

Серьезно, вам нужно изучить основы, прежде чем вы начнете пытаться сделать что-то даже смутно сложное.

Member 10628309

Возможно, вы захотите прочитать инструкции, приведенные здесь: "не говорите кому-то, чтобы он читал руководство. Скорее всего, у них есть, но они этого не понимают. Дайте ответ или переходите к следующему вопросу. Давайте работать, чтобы помочь разработчикам, а не заставлять их чувствовать себя глупо."
Я не чувствую себя ни глупой, ни глупой.

phil.o

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