c # - Sådan tilføjes en kontrol til et panel på en formular fra en anden brugerkontrol

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en form1.cs og i den form har jeg et panel1, i belastningsbegivenheden i form1.cs Jeg tilføjer en kontrol til panelet1. Nu er mit problem, jeg har en kontrol kaldet Numbers.cs, jeg skal tilføje en anden kontrol til dette panel1, men fra denne kontrol i en knaphændelse. Hvordan kan jeg gøre dette?


public partial class Number : UserControl
{
    public Number()
    {
        InitializeComponent();
    }

    private void btnAcceptWelcome\_Click(object sender, EventArgs e)
    {
          //HERE I NEED TO PASS A CONTROL TO THE PANEL1 IN FORM1.CS
          //NOT SURE HOW TO DO THIS.
    }
}


MERE INFO


Så dybest set har jeg en mappe kaldet UserControls og i den mappe jeg har


Numbers.cs
Letters.cs
Welcome.cs


Alle dem brugerkontroller, så har jeg en formular


Form1.cs


Form1.cs instantiates Velkommen, og det tilføjes til et Panel1 på Form1.cs på formularbelastning. Så har Welcome.cs en knap, når jeg klikker på denne knap, skal jeg bytte til Numbers.cs. Men jeg ved ikke hvordan man gør det fra Welcome.cs

Bedste reference


En anden måde ville være at bruge en brugerdefineret begivenhed opkaldt af numre og håndteres af Form1 for at passere kontrollen og tilføje den til panelets kontrolsamling. [16]





Dette er et eksempel på en brugerdefineret begivenhed tilføjet til UserControl1


Form1


public partial class Form1 : Form
{
    UserControl2 mySecondControl = new UserControl2();
    public Form1()
    {
        InitializeComponent();
        userControl11.AddControl+=new EventHandler(SwapControls);

    }

    private void SwapControls(object sender, EventArgs e)
    {
        panel1.Controls.Remove(userControl11);
        userControl11.AddControl -= new EventHandler(SwapControls);
        panel1.Controls.Add(mySecondControl);
    }
}


UserControl


public partial class UserControl1 : UserControl
{
    public event EventHandler AddControl;
    public UserControl1()
    {
        InitializeComponent();
    }

    private void button1\_Click(object sender, EventArgs e)
    {
        this.AddControl(this, new EventArgs());
    }
}

Andre referencer 1


Bemærk:



  1. Uprøvet kode

  2. Antag Form1 har (eller kan få) en henvisning til Number



Tilføj en begivenhedshandler til Number:


public partial class Number : UserControl
{
    //  event handler Form1 will subscribe to
    public EventHandler<EventArgs> OnWelcomeAccepted = (o, e) => { };

    public Number()
    {
        InitializeComponent();
    }

    private void btnAcceptWelcome\_Click(object sender, EventArgs e)
    {
          //  raise the event
          OnWelcomeAccepted(sender, e);
    }
}


... Form1 vil have et abonnement efter InitializeComponent(); Bemærk det ekstra abonnement på ControlAdded: [17]


public partial class Form1 : Form {
    public Form1()
    {
        InitializeComponent();

        this.ControlAdded += Control\_Added;
        //  subscribe to the event and provide the implementation
        Number.OnWelcomAccepted += (o, e) => { Controls.Add(GetControl( )); }
    }

    private void Control\_Added(object sender, System.Windows.Forms.ControlEventArgs e)
    {
        //  process size and placement and show
    }

}


Ingen anden kontrol bør tilføje noget direkte til Form1. Lad Form1 kontrollere sine børn.

Andre referencer 2


En måde er at henvise til panel1 inden for tal, da begge er oprettet inden for form1, kan du passere en som et argument til den anden s konstruktør.

Andre referencer 3


Det er ikke meget klart fra din beskrivelse, men du kan bare passere den kontrol, du ønsker i konstruktøren eller en ejendom. Da i C # objekter altid er som reference, vil du være handling på samme kontrol i Button-begivenheden. Du kan altid skrive din egen begivenhed og have panelregistret for det. En mere fuldstændig kodeeksempel ville være fantastisk.


Jeg er stadig lidt usikker på hvad du gør nøjagtigt, men det er OK. Jeg synes, at den mest fleksible tilgang er at skabe din egen tilpassede begivenhed. Uden for en klasse opretter du en delegat:


public delegate void WelcomeClick(object sender, EventArgs e);


Inside Velkommen, du skal oprette hændelseshandleren, det kan enten være statisk eller en del af forekomsten:


public event WelcomeClick OnClick;


Inde i Button Click-arrangementet i velkomst kan du bare ringe til den begivenhed med de samme parametre:


if (OnClick != null)
                OnClick(sender, e);