2014-01-14 1 views
0

vb.net에서 vb6으로 응용 프로그램을 마이그레이션했습니다.양식에서 모듈로 텍스트 상자 텍스트 전달

모듈의 SearchFields에서 textbox1의 텍스트에 액세스하고 싶습니다.

너무 많은 컨트롤을 전달해야하므로 매개 변수로 전달하고 싶지 않습니다.

몇 가지 예를 제공해주십시오.

내 코드는 내가

Sub SearchFields() 
    Dim str As string 
    Dim frm As New frmNew 
    str = frm.Textbox1.Text 
End Sub 
다음 방법은

frmNew.Textbox1.Text이 가능한 한 적은 재 코딩 작업을 수행하려면 아무

+1

어떤 부호를 첫째로 제공하십시오. – Neolisk

+0

설명을 추가했습니다. – user3180163

+2

'Dim frm As New frmNew'가 기존 양식을 참조하지 않습니다. 매개 변수로 참조를 전달해야합니다. .Net으로 이동하려면 프로그램의 구조를 재고해야합니다. 모듈은 일반적으로 클래스로 대체되어야합니다. 대부분 전역 변수를 피하십시오. – LarsTech

답변

1

을 받고되지 않습니다이 frmNew 페이지 모듈 내부 Textbox1의

Private Sub Ok_Click(.....) 
    call SearchFields() 
    Me.Close() 
End Sub 

이있다 두 가지 방법을 다음과 같이 변경할 수 있습니다. 이 작업을하려면 Textbox1이 공개로 표시되어야합니다. @LarsTech가 지적했듯이 개인적으로 .Net으로 VB6 응용 프로그램을 "마이그레이션"해야했습니다.이 경우 구문 변경이 아니라 앱 재검토가 필요합니다.

Private Sub Ok_Click(.....) 
    call SearchFields(Me) 
    Me.Close() 
End Sub 

Sub SearchFields(Form frm) 
    Dim str As string 

    str = frm.Textbox1.Text 
End Sub 
+0

감사합니다 AWinkle ... 지금 나는 올바른 가치를 얻고 있습니다. 하지만 SearchFields() 메서드가 직면 한 한 가지 방법은 여러 양식에서 호출되므로 어떤 매개 변수를 전달해야합니까? 그렇지 않으면 완전히 새로운 방법을 만들어야합니다. – user3180163

+0

TextBox의 이름이 Textbox1이 아닌 경우 Form에서 TextBox로 매개 변수를 변경하고 올바른 TextBox 컨트롤을 직접 전달하는 것이 좋습니다. 항상 Textbox1이라는 이름이 지정되면 Me (Me는 현재 개체에 대한 참조)를 전달할 수 있으며 SearchFields 메서드는 항상 올바른 인스턴스를 갖습니다. 최대한의 재사용 가능성과 지속 가능성을 원한다면 TextBox를 가져 오는 메소드를 리팩터링하십시오. – AWinkle

0

검색 텍스트에 사용할 컨트롤에 대한 참조를 전달할 수 있습니다. 이렇게하면 SearchFields 메서드가보다 일반적으로 사용됩니다. 예를 들어 frmNew이라는 양식과 Searching이라는 모듈을 만들었습니다. 양식에서 나는 Ok, TextBox 및 ComboBox라는 버튼을 배치했습니다.

Public Class frmNew 

    Private Sub Ok_Click(sender As Object, e As EventArgs) Handles Ok.Click 
     Searching.SearchFields(TextBox1) 
     Searching.SearchFields(ComboBox1) 
     Me.Close() 

    End Sub 

End Class 

는 모듈에 전달 된 제어 (I는 Searching 지명하는) 처리에 대해 취할 수있는 두 가지 방법이 있습니다. 먼저, 컨트롤의 종류를 확인하고 그 기반으로 작업을 수행 할 수 있습니다

Module Searching 

    Sub SearchFields(textSource As Control) 
     Dim str As String = "" 

     ' just for invesigating, show the type of the control. 
     Console.WriteLine(TypeName(textSource)) 

     If TypeOf textSource Is System.Windows.Forms.TextBox Then 
      str = textSource.Text 

     ElseIf TypeOf textSource Is System.Windows.Forms.ComboBox Then 
      Dim src = DirectCast(textSource, ComboBox) 
      If src.SelectedIndex >= 0 Then 
       str = src.SelectedItem.ToString() 
      Else 
       ' nothing was selected. Do whatever is appropriate. 
       str = "NOTHING SELECTED!" 
      End If 

     End If 

     'TODO: the searching code. 
     Console.WriteLine(str) 

    End Sub 

End Module 

또는 당신이 인수에 대응하는 방법의 버전을 실행하는 방법 오버로드, 활용할 수 있습니다 (들) 너는 그것에 패스한다 :

Module Searching 

    Sub SearchFields(src As TextBox) 
     DoSearch(src.Text) 
    End Sub 

    Sub SearchFields(src As ComboBox) 
     'TODO: check an item is selected. 
     Dim txt = src.SelectedItem.ToString() 
     DoSearch(txt) 
    End Sub 

    Private Sub DoSearch(s As String) 
     ' do the search 
     Console.WriteLine(s) 
    End Sub 

End Module