2017-12-13 12 views
0

私は、異なるユーザーコントロールを表示したり、別のボタンで非表示にすることができるウィンドウフォームを持っています。私は、このユーザーをしたいと思い同じフォーム内のユーザーコントロール間の移動

は、彼らは[実行]をクリックしたときに、その後、フォームを記入します互いに直接通信し、

enter image description here

ユーザー以下の例のUserControl1の場合など

値を変更することでUserControl1を制御します

enter image description hereを以下のように閉じなければならないと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だけが非表示になっていて、空白が残っています。 私は間違っているのですか? (Visual Studioの13とC#言語を使用して)

+1

あなたはMainFormをの新しいインスタンスを作成している、あなたはそのインスタンスに新しいユーザーコントロールを追加しますので。 _f1.Show(); _を追加すると表示されます。しかし、私は、あなたがMainFormの既存のインスタンスに新しいusercontrolを追加したいと思っています – Steve

+0

@steveはい...どうすればMainFormの新しいインスタンスを作成せずにコントロールを追加できますか? – BiKe

+0

最も簡単な方法では、現在のMainFormのインスタンスをUserControlコンストラクタに渡し、そのインスタンスをUserControlのグローバル変数に保存し、2つのusercontrolを切り替える必要があるときにそのインスタンスを使用します。これは、他のタスクを正しく処理するためには問題になります。メインフォームが必要なときにどのユーザーコントロールを表示するかを決定するために、アプリケーションを再設計することをお勧めします。 – Steve

答えて

0

私はこのためBackgroundWorkerのコントロールを使用すると、実際にあなたのケースのために働くと思います。

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上の2つのコントロールを同じ位置にレイヤーするだけで、2番目のコントロールのVisibleプロパティをFalseに設定することができます。

ボタンのクリックに対するイベントを最初のユーザーコントロールに公開するか、そのボタンを公開してClickイベントにアクセスできるようにして、メインフォームからそのマウスクリックを検出できるようにします。次に、そのボタンのリスナーが呼び出されたとき。メインフォームは最初のコントロールからデータを取得し、それを使って2番目のコントロールを初期化し、最初のコントロールを非表示にして2番目のコントロールを表示することができます。

0

MainControlの新しいインスタンスに新しいusercontrolを追加しています。この新しいインスタンスは決して表示されないので、それを見ることはできません。現在のMainFormのインスタンスをUserControlコンストラクタに渡す場合、UserControlのグローバル変数にそのインスタンスを保存し、2つのUserControlを切り替える必要がある場合はそのインスタンスを使用します。 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で

(あなたが最初のユーザーコントロールを作成する)

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

これは正しく、他のタスクのために処理するために、問題になる可能性があります。メインフォームが必要なときにどのユーザーコントロールを表示するかを決定するために、アプリケーションを再設計することをお勧めします。

このアプローチでは、ユーザーがUserControl1をクリックしたときにイベントを使用してMainForm.csに通知されるので、これをMainFormで取得します。CS

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})); 
} 

しかし、新しいユーザーに関する情報を受け取ったのMainForm方法であるとのUserControl1にあなたは、イベントをデリゲートを追加したときにイベントを発生させる

UserControl1 uc = new UserControl1(); 
uc.UserClick += UserAdded; 
..... 

あなたの新しいユーザに関する情報を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;} 
} 
関連する問題