2012-05-27 8 views
2

У меня есть событие MouseEnter, которое в настоящее время обрабатывает некоторые пользовательские элементы управления в моей форме. Программа - карточная игра. У меня есть коллекция (handCards), которая заполняется, когда пользователь рисует карту, а затем добавляет последнюю форму в форму. В этой коллекции хранятся карты различных пользовательских типов, все, что наследуется от picturebox. Рисование карт из колоды и добавление их в форму отлично работает. Проблема, с которой я столкнулась, заключается в том, что во время выполнения, после того, как карта была нарисована и добавлена ​​в форму, я создал строку кода addhandler, чтобы эти карточки отвечали на мое событие MouseEnter, но моя строка кода addhandler сообщает мне, что MouseEnter не является событием объекта. Как я могу обойти это, чтобы после того, как карта была нарисована и добавлена ​​в форму, когда мышь входит в новый настраиваемый элемент управления, мое событие MouseEnter срабатывает? Вот одна из многих вещей, которые я пробовал, и то, что я думаю, должно быть самым простым и легким, что должно работать.AddHandler для пользовательских элементов управления error visual studio

deck.DrawCard() 
AddHandler handCards(handCards.Count).MouseEnter, AddressOf Cards_MouseEnter 

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

ответ

1

Так вот как я установил его, в случае, если кто приходит на этот пост. Сделал отдельный Sub, чтобы сделать AddHandler. После того, как программа рисует карту, она вызывает этот метод, который затем добавляет обработчик MouseEnter, в котором я нуждаюсь. ByVal был ключевым. Первоначально я думал, что должен использовать ByRef, но нет. MouseEnter - это событие контроля, но, по-видимому, не Object, поэтому теперь оно работает.

Public Sub addHandlers(ByVal inputObject As Control) 
    AddHandler inputObject.MouseEnter, AddressOf Cards_MouseEnter 
End Sub 
+0

Если ваш массив handCards по-прежнему имеет тип 'Object', то это не очень хорошая идея, потому что объект, который вы передаете' addHandlers', будет неявно преобразован в тип 'Control'. Вы можете добавить любой объект в массив, ссылки которого имеют тип 'Object', так как каждый объект спускается из типа' Object'. Но если вы добавите что-то, что не спустится с 'Control' в массив handCards, а затем вы передадите это вашему методу addHandlers, вы получите исключение во время выполнения, когда неявное преобразование завершится с ошибкой.Вы можете сказать, что этого никогда не произойдет, но неявное преобразование типа обычно считается плохой идеей. –

+0

Параметры вашего компилятора могут игнорировать неявные преобразования, но лично я считаю, что рекомендуется изменить параметр, чтобы хотя бы предупредить о неявных преобразованиях. –

+0

hmmm, не уверен, как это сделать или найти эту настройку. Я как бы учился, когда я ухожу. Подумайте, я должен попытаться поймать там? Я действительно никогда не думал, что какие-либо из карт в колоде (которые все наследуют от PB) не будут работать с сообщением addhandler, но лучше всего быть в безопасности, я полагаю. –

1

Я предполагаю, что ваша коллекция HandCards - это коллекция объектов. Попробуйте приведения его к соответствующему типу с помощью CType, что-то вроде этого:

AddHandler CType(handCards(handCards.Count), PictureBox).MouseEnter, AddressOf Cards_MouseEnter 

, как @Jason упоминалось, используя handCards.Count как индекс не будет работать, потому что это общее количество элементов, где, как ваш индекс равен нулю и на основе будет меньше, чем граф. так handCards(handCard.Count) должно быть handCards(handCards.Count -1)

+0

Кастинг, возможно, сработал, но я понял, что выложил решение. Спасибо за вашу помощь. –

+0

@ clanier9 рад, что вы это поняли. Кастинг будет работать, поскольку ваши карты основаны на PictureBox. –

1

Вы можете использовать общую коллекцию, чтобы избежать литья типов.

Private handCards As System.Collections.Generic.List(Of PictureBox) _ 
    = New System.Collections.Generic.List(Of PictureBox)(52) 

Или вы могли бы просто использовать массив объектов PictureBox

Private handCards(5) As PictureBox 

Помните, что вы должны инициализировать коллекцию или массив, хотя, путем присвоения PictureBox объекта к каждому элементу из массив.

Теперь вы можете добавить обработчик к PictureBox элементу массива, так как PictureBox происходит от Control, который реализует MouseEnter событие.

deck.DrawCard() 
If handCards.Count > 0 andAlso handCards.Last() IsNot Nothing then 
    AddHandler handCards.Last().MouseEnter, AddressOf Cards_MouseEnter 
End If 

Ваш обработчик будет выглядеть как этот

Private Function Cards_MouseEnter(sender As Object, e As System.EventArgs) As Object 
    ' Handle mouse events here 
End Function 
+0

+1 Хорошая привязка к индексу массива –

+0

handcards - это коллекция, которая начинается с индекса 1. Я действительно попытался сделать цикл через коллекцию и таким образом добавить обработчик, но он тоже не работал (такая же ошибка). Я все-таки заработал, и разместил решение ниже. Спасибо за вашу помощь. –

+0

@ clanier9 Индексная точка массива является случайной. Более важно то, что в вашем вопросе вы добавляете обработчик для элемента в index 'handCards.Count', который, вероятно, не тот, который вы хотите. Реальный основной момент, однако, касается типа и наследования. В вашем вопросе вы пытаетесь получить доступ к событию 'MouseEnter' из ссылки« Object ». Поскольку 'MouseEnter' определен в классе' Control', вам нужна ссылка 'Control' или один из его подклассов, например' PictureBox', который я предложил, так как вы сказали, что все ваши объекты произошли от этого. –

1

К счастью, я работал, и мне удалось это успешно решить.

Первый метод Add Event Handler Где бы вы Желаний, Для теста я добавил эту функцию в Button_Click

addHandlers(Label1) 'Label one is the control on which I have to attach Mouse Events (Enter,LEave) 

Теперь функция "addHandlers" реализация

Public Sub addHandlers(ByVal obj1 As Control) 
    AddHandler obj1.MouseEnter, AddressOf MouseEventArgs 
    AddHandler obj1.MouseLeave, AddressOf _MouseLeave 
End Sub 

Теперь события мыши:

Private Function _MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) As Object 
    Try 
     Me.Cursor = Cursors.Default 
    Catch ex As Exception 

    End Try 

End Function 

Private Function MouseEventArgs(ByVal sender As Object, ByVal e As System.EventArgs) As Object 
    Try 
     Me.Cursor = Cursors.Hand 
    Catch ex As Exception 

    End Try 
End Function