2013-05-25 3 views
2

가 나는 동적으로 기존 형태의 새로운 인스턴스를 만들려면, 간단히 말해서 나는이 작업을 수행 할 수 있다는 것을 알고기존 컨트롤의 새 인스턴스 만들기? ...

Dim NewForm As New ExistingForm 

... 그리고 새로운 인스턴스를 (좀 더 복잡한 그것은 생각보다) ExistingForm의 모든 컨트롤 중 NewForm에서 사용할 수 있습니다.

그러나 기존 컨트롤의 새 인스턴스를 별도의 기존 양식에 만들려면 어떻게해야합니까?

더 구체적으로 말해서, 내가 2 가지 형태 - FormAFormB을 가지고 있다고 가정 해 보겠습니다. 내부 FormB은 기존 패널입니다 (우리는 이것을 ExistingPanel이라고합니다). 그리고 안으로 ExistingPanel 몇 가지 버튼, 텍스트 상자, 등, 정확히 내가 원하는 방법으로 배열되어 있습니다.

OK ... FormA의 버튼 클릭 이벤트 안에,이 작업을하고 싶습니다. (분명히 작동하지 않지만 분명히 달성해야 할 작업에 대한 좋은 아이디어를 제공해야합니다.) ...

Dim NewExistingPanel As New FormB.ExistingPanel 

그리고는 나는 동적으로 개별적으로 각각을 조작 할 수 있습니다 (그래서) ExistingPanel에서 새로운 인스턴스를 개별 컨트롤을 모두 포함 NewExistingPanel를 원한다.

기본적으로 내 프로그램은 런타임에 여러 개의 NewExistingPanel을 만들어야합니다. 그리고 내가 만든 후에는 각각 하나 (그리고 모든 자식 컨트롤)에 개별적으로 액세스해야합니다.

어떻게하면됩니까? 나는 지금까지 몇 시간 동안이 실험을 해왔다. 그래서 분해해서 실제 전문가에게 물어 보았다. :)

답변

2

사용자 컨트롤을 사용하면 태그 값을 키로하고 컨트롤 이름을 값으로 사용하여 사전을 사용할 수 있습니다. 그런 다음 IndexOfKey 메서드를 사용하여 직접 컨트롤에 액세스 할 수 있습니다.

Dim NewForm2 As New Form2 
    Dim ControlIndex As New Dictionary(Of String, String) 
    For I = 0 To 2 
     Dim NewPanel As New WindowsControlLibrary2.MyCustomPanel 
     NewPanel.Name = "Panel-" + I.ToString 
     NewPanel.Location = New Point(0 + (NewPanel.Size.Width * I), 0) 
     NewPanel.Tag = "MyTagValue" + I.ToString 
     ControlIndex.Add(NewPanel.Tag, NewPanel.Name) 
     NewForm2.Controls.Add(NewPanel) 
     NewForm2.Update() 
    Next 
    NewForm2.Show() 
    Dim CurrentPanel As WindowsControlLibrary2.MyCustomPanel =NewForm2.Controls(NewForm2.Controls.IndexOfKey(ControlIndex("MyTagValue1"))) 
+0

그건 좋은 생각이야, tinstaafl, 그리고 그것은 내 최고의 선택이 될지도 모른다. 자세한 예제를 제공해 주셔서 감사합니다! 나는 그 장면을 줄 것이다. – NotQuiteThereYet

+0

'IndexOfKey'는 필요 없습니다; '컨트롤 '은 이름으로 인덱스 될 수 있습니다. 하지만 패널을 사전에 저장하는 것이 좋습니다. – Ryan

1

다음과 같은 방법으로 하위 컨트롤을 만들 수있다. 그 (것)들을 원한다, 그 후에 그것의 새로운 경우를 창조하십시오. Add New> User Control을 선택하여 만든 다음 도구 상자의 맨 위에있는 디자이너로 드래그하거나 다른 컨트롤처럼 코드로 인스턴스화 할 준비가되어 있어야합니다. 다음과 같이

Private somePanels As New Dictionary(Of String, YourUserControl) 

그럼 당신은 단지 그들을 추가 할 수 있습니다 :

내 의견에 확장하려면

Dim c As New YourUserControl() 
… 
Me.Controls.Add(c) 
somePanels.Add("SomeTag", c) ' Instead of using Tag; if your tags are numbers, use a List instead of a Dictionary 

을 그리고 그들을 액세스 : 새를 만들 때

Dim c = somePanels("SomeTag") 
+0

내가 너를 올바르게 이해한다면, 그게 내가하려는 일이야. 런타임시에 새 인스턴스 (모든 자식 컨트롤과 함께)에 액세스하는 방법을 모르겠습니다. – NotQuiteThereYet

+0

@NotQuiteThereYet : 사용자 정의 컨트롤을 만들고 이미 양식에 추가 했습니까? 아직 없습니까? ;) – Ryan

+0

하하 ... 나는 그 하나를 기다리고 있었다 : 예, 위에서 설명한 것처럼 FormB에는 'ExistingPanel'이라는 패널이 있습니다. ExistingPanel 안에는 여러 가지 컨트롤이 있습니다. <- 그 모든 것은 디자이너에서 만들어졌습니다. 하지만 런타임에, 나는 ExistingPanel의 12 인스턴스를 만들고 싶습니다. 런타임에 생성 된 인스턴스는 각 인스턴스 (및 모든 자식 컨트롤)를 개별적으로 가져 오는 방법이 필요합니다. 말이 돼? – NotQuiteThereYet

1

텍스트 상자가있는 버튼이있는 패널과 같은 컨트롤을 추가하려면 ..프로젝트에서

  1. - 추가> UserControl을 -이 부분에서>
    당신은 당신이 원하는대로 텍스트 상자와 버튼 패널을
    이름을 으로 "myPanel"와 로 저장할 수 있습니다 "myPanel.vb"-> 또는

  2. 양식에

    단추 1 당신이 당신의 Button1_Click 이벤트에 추가 할 수 있습니다이라는 버튼을 원하는 :

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    
         Dim mypanel1 As New MyPanel 
    
         mypanel1.Location = New Point(0, 0) 
    
         Controls.Add(mypanel1) 
         mypanel1.TextBox1.Text = "Hi, Im new" 
    
    End Sub 
    

그리고 당신은 런타임에 패널을 얻을 것이다 ...

그리고 당신은이 "안녕, 나는 새로운 해요"채우기 textbox1.text 얻을 것이다 ...

+0

안녕하세요. matzone ... 감사합니다.하지만 mypanel1의 여러 인스턴스를 만들고 각각의 특정 인스턴스 (및 모든 자식)에 개별적으로 액세스 할 수 있어야하므로, 런타임의 다른 지점에서 다른 서브 루틴으로 이동합니다. 귀하의 예를 사용하여 어떻게 할 수 있을지 확신하지 못합니다. tinstaafl이 제안했듯이 사전을 사용하는 것이이 방법에 대한 길일 수 있다고 생각합니다. 어쨌든 고마워! :) – NotQuiteThereYet

관련 문제