2017-12-13 26 views
0

다른 사용자 컨트롤을 다른 버튼으로 표시하거나 숨길 수있는 Windows 폼이 있습니다. 나는이 사용자가 원하는같은 양식의 사용자 컨트롤 간 이동

는, 그들이 진행을 클릭하면 다음 양식을 작성합니다 서로 직접 통신 및

enter image description here

사용자 아래 예제 UserControl1을 들어 등

값을 변경하기 위해 UserControl1을 제어 다음과 같이 사용자 정보를 선택하여 표시하여 usercontrol2가 표시되어야합니다.

는 지금까지 그것은 작동하지 않습니다

private void btnProceed_Click(object sender, EventArgs e) 
    { 
     string name = tbName.ToString(); 
     string email = tbEmail.ToString(); 
     string phone = tbPhone.ToString(); 
     string color = tbColor.ToString(); 

     this.Hide(); 

     UserControl2 u2 = new UserControl2(); 

     MainForm f1 = new MainForm(); 
     f1.panelMain.Controls.Add(u2); 

     f1.listView1.Items.Add(new ListViewItem(new[]{ 
          name, 
          email, 
          phone, 
          color})); 
    } 

아래의 코드가 있습니다. usercontol1 만 숨겨져 있고 빈 칸으로 남았습니다. 내가 뭘 잘못하고있어? 나는 이것에 대한 BackgroundWorker에 컨트롤을 사용하여 생각

+1

MainForm의 새 인스턴스를 만들고 해당 인스턴스에 새 usercontrol을 추가했기 때문에. _f1.Show(); _를 추가하면 표시됩니다. 그러나 MainCont의 기존 인스턴스에 새 usercontrol을 추가하려고한다고 가정합니다. – Steve

+0

@steve 예 .... MainForm의 새 인스턴스를 만들지 않고 컨트롤을 추가하려면 어떻게해야합니까? – BiKe

+0

가장 간단한 방법으로 현재 MainForm의 인스턴스를 UserControl 생성자에 전달하면 해당 인스턴스를 UserControl의 전역 변수에 저장하고 두 개의 usercontrol을 전환해야 할 때 해당 인스턴스를 사용합니다. 이것은 다른 작업을 올바르게 처리하기 위해 문제가됩니다. MainForm이 필요할 때 표시 할 사용자 정의 컨트롤을 결정하도록 응용 프로그램을 다시 디자인하는 것이 좋습니다. – Steve

답변

0

(비주얼 스튜디오 13와 C# 언어를 사용)

실제로 사건에 대한 작동합니다.

private void btnProceed_Click(object sender, EventArgs e) 
{ 
    string name = tbName.ToString(); 
    string email = tbEmail.ToString(); 
    string phone = tbPhone.ToString(); 
    string color = tbColor.ToString(); 

    string a = " "+name+" "+email+" "+phone+" "+color; 

    backgroundWorker1.RunWorkAsync(a);//passing the variables to the backgroundWorker 
} 

그리고 backgroundWorker_doWork에(), 당신은 당신이 원하는대로 당신이 얻고있는 데이터를 채울 수 있습니다

.

0

너는 것들을 지나치게 복제하고있다. UI의 두 컨트롤을 같은 위치에 레이어하고 두 번째 컨트롤의 Visible 속성을 False으로 설정할 수 있습니다.

첫 번째 사용자 정의 컨트롤이 버튼 클릭에 대한 이벤트를 노출하도록하거나 해당 Click 이벤트에 액세스 할 수 있도록 버튼을 드러내십시오. 그러면 기본 폼에서 마우스 클릭을 감지 할 수 있습니다. 그런 다음 해당 버튼에 대한 리스너가 호출되면 기본 폼은 첫 번째 컨트롤에서 데이터를 가져와 두 번째 컨트롤을 초기화하고 첫 번째 컨트롤을 숨기고 두 번째 컨트롤을 표시 할 수 있습니다.

0

MainControl의 새 인스턴스에 새 usercontrol을 추가하고 있습니다. 이 새 인스턴스는 절대로 표시되지 않으므로 볼 수 없습니다. 현재 MainForm의 인스턴스를 UserControl 생성자에 전달하는 가장 간단한 방법으로이 문제를 피하려면 해당 인스턴스를 UserControl의 전역 변수에 저장하고 두 개의 usercontrols를 전환해야 할 때 해당 인스턴스를 사용하십시오. UserControl1.cs

public class UserControl1 
{ 
    MainForm _current; 
    public UserControl1(MainForm f) 
    { 
     InitializeComponent(); 
     _current = f; 
    } 
    private void btnProceed_Click(object sender, EventArgs e) 
    { 
     ..... 
     UserControl2 u2 = new UserControl2(); 
     _current.panelMain.Controls.Add(u2); 
     u2.listView1.Items.Add(new ListViewItem(new[]{ 
         name, 
         email, 
         phone, 
         color})); 
    } 
} 

에서 MainForm.cs에서

(첫 번째 UserControl을 만들 때)

UserControl1 uc = new UserControl1(this); 
..... 

이 제대로 다른 작업에 대한 처리 문제가 될 것입니다. MainForm이 필요할 때 표시 할 사용자 정의 컨트롤을 결정하도록 응용 프로그램을 다시 디자인하는 것이 좋습니다.

이 접근 방식에서는 사용자가 UserControl1을 클릭 할 때 MainForm.cs에서 이벤트를 사용하여 MainForm에서이 정보를 얻을 수 있습니다.CS

UserAdded 새 사용자에 대해 정보를받은 MainForm하는 방법입니다
UserControl1 uc = new UserControl1(); 
uc.UserClick += UserAdded; 
..... 

하지만 클래스 UserInfoArgs

public void UserAdded(UserControl1 sender, UserInfoArgs args) 
{ 
    sender.Hide(); 
    UserControl2 u2 = new UserControl2(); 
    this.panelMain.Controls.Add(u2); 
    u2.listView1.Items.Add(new ListViewItem(new[]{ 
         args.name, 
         args.email, 
         args.phone, 
         args.color})); 
} 

그리고 UserControl1을 당신이 대리자, 이벤트를 추가 할 때 이벤트를 마련 새 사용자에 대한 정보를 MainForm과 통신해야합니다.

public class UserControl1 
{ 
    public delegate void onClick(UserControl1 sender, UserInfoArgs args); 
    public event onClick UserClick; 
    .... 
    private void btnProceed_Click(object sender, EventArgs e) 
    { 
     UserInfoArgs args = new UserInfoArgs() 
     { 
      name = tbName.Text, 
      email = tbEmail.Text, 
      phone = tbPhone.Text, 
      color = tbColor.Text 
     }; 
     if(UserClick != null) 
      UserClick(this, args); 

} 
public class UserInfoArgs 
{ 
    public string name {get;set;} 
    public string email {get;set;} 
    public string phone {get;set;} 
    public string color {get;set;} 
}