Otwieranie User Control w Form1 za pomocą przycisku w innym User Control

0

Witam.
Mam projekt WindowsFormsApplication1, w którym do Form1 podczas załadowania się forma dodaje do panelu w tym formie UserControl1.

private void Form1_Load(object sender, EventArgs e)
{
	UserControl1 uc1 = new UserControl1();
	panel1.Controls.Add(uc1);
}

W UserControl1 mam przycisk, który po kliknięciu usuwa z panelu w Form1 UserControl1 a wstawia UserControl2.

private void button1_Click(object sender, EventArgs e)
{
	Form1 f1 = new Form1();
	UserControl2 uc2 = new UserControl2();
	Visible = false;
	f1.panel1.Controls.Add(uc2);
}

Mój problem polega na tym, że gdy już odpalę program to pojawia się UserControl1 z tym przyskiem i gdy kliknę na ten przycisk to UserControl1 znika a nie pojawia się UserControl2. Jak zrobić aby po kliknięciu przycisku w UserControl1 znikł UserControl1 a dodał się do panel1 w Form1 UserControl2?

0

Musisz w kontrolce użytkownika odnieść się do formy tej, w której jest już UserControl1. Ty natomiast tworzysz nowy obiekt Form1 i tam dodajesz do panelu UserControl1 w nowej formie, a nie tej którą obsługujesz. Musisz przekazać formę do kontrolki poprzez :

 
public class UserControl1 : UserControl
{
        public Form1 Form {private set; get;}
       
        public void SetForm(Form1 form)
        {
                  this.Form = form;
        }

}

W formie natomiast

uc1.SetForm(this);
 
1

możesz tez pod button1 w UserControl1 dodać nowe zdarzenie i obsłużyć je z poziomu Form1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TestUserControl
{
public partial class UserControl1 : UserControl
{
public delegate void Button1ClickEventHandler(object sender, EventArgs e);
public event EventHandler Button1Click;

    public UserControl1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (Button1Click != null)
        {
            Button1Click(this, e);
        }
    }
}

}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TestUserControl
{
public partial class Form1 : Form
{
private UserControl1 uc1 = new UserControl1();
public Form1()
{
InitializeComponent();
}

    private void Form1_Load(object sender, EventArgs e)
    {

        uc1.Button1Click += new System.EventHandler(this.userControl11_Button1Click);
        panel1.Controls.Add(uc1);

    }

    private void userControl11_Button1Click(object sender, EventArgs e)
    {

        uc1.Visible = false;

        UserControl2 uc2 = new UserControl2();
        panel1.Controls.Add(uc2);
    }
}

}

0

W przypadku tak zaawansowanych operacji, poszedłbym raczej w stronę sensownej architektury, np. MVP, zamiast ciągnąć to spaghetti. Jeszcze trochę i zupełnie nie będzie wiadomo, co się w tym kodzie dzieje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1