2014-07-09 6 views
0

좋아요. 저는 비주얼 스튜디오에서 일하고 있는데, 약간의 걸림돌을 맞았습니다. 기본적인 상황은 서로 대응하는 버튼과 타이머를 가지고 있습니다. 예를 들어 button1을 클릭하면 Timer1이 시작됩니다.이름으로 타이머 찾기

현재 모든 버튼 클릭을 처리하는 한 가지 방법을 사용하고 있습니다. CR (1, 2, 3, ... 등)을 식별하고 그와 함께 맞는 올바른 타이머의 이름 문자열을 구성합니다 (dim timername as string = "timer" & cr.ToString). 그런 다음 Me.Controls(cr).Enabled = True을 사용하면 null 포인터 오류가 반환됩니다.

나는이 문제가 타이머의 신원 확인과 관련이 있다는 것을 알고있다.

답변

0

문자열을 사용하여 컨트롤을 식별 할 수 없습니다 (쉽지 않음). 이 시도.

Private Sub ButtonX_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click ' etc. 
    Dim vButton = DirectCast(sender, Button) 
    Select Case vButton.Name 
     Case "Button1" 
      Timer1.Start ' Or stop, or whatever 
     Case "Button2" 
      Timer2.Start 
    End Select 
End Sub 

는 또한 If vButton Is Button1를 사용하여 버튼 객체 자체를 비교할 수 있습니다,하지만 (나는 그렇게 GetType을하고 물건을 사용하지 기억) VB에서 지저분한 가져옵니다.

그러나 코드가 예제와 같이 간단하면 각 버튼마다 별도의 핸들러를 사용하지 않는 것이 좋습니다.

0

타이머는 Component이 아니며 Control이 아니므로 Control Collection에 위치 할 수 없습니다. 이것은 아마도 이 아닌 더 나은 경우입니다.은 일반적인 버튼 클릭 핸들러를 사용합니다. 아무 것도 단순화하지 않으므로 사용하는 것이 좋습니다.

그러나 Button과 같이 Object에서 상속 한 모든 것은 해당 객체와 사물을 연결하는 데 사용할 수있는 Tag 속성을가집니다.

Button1.Tag = Timer1 
Button2.Tag = Timer2 
Button3.Tag = Timer3 

그런 다음 클릭 이벤트 :

Private Sub ButtonX_Click(... etc) Handles Button1.Click, Button2.Click ... 

    Dim thisBtn As Button = CType(sender, Button) 
    Dim thisTmr As Timer = Ctype(thisBtn.Tag, Timer) 

    thisTmr.Start 
End Sub 
형태로드에서