Domanda

Sto costruendo una WinForm con un bel paio di elementi dinamici, e penso che sto avendo alcuni problemi con la relazione padre/figlio all'interno di controlli nidificati.Tutte le domande che ho potuto trovare sembrava esclusivo per WebForms, che non era del tutto utile.

Ho anche avuto qualche problema con custom-made controlli, ma che potrebbe essere un problema correlato.

Sto cercando di visualizzare un numero di PictureBoxes, ciascuna con un numero di associati NUDs.Inizialmente ho fatto questo da fare un sacco di controlli da parte, ma ora voglio automatizzare il processo e ri-utilizzare il codice altrove.

Il codice è un po ' più complicato di così, ma ecco i pezzi importanti in un mix di Pseudocodice e codice vero e proprio

panel_book.Controls.Clear();

for (loop controls)
{

    //INITIALIZE CHILD CONTROLS
    PictureBox tempBox = new PictureBox();
    NumericUpDown t1 = new NumericUpDown();
    NumericUpDown t2 = new NumericUpDown();
    NumericUpDown t3 = new NumericUpDown();
    NumericUpDown t4 = new NumericUpDown();

    tempBox.Image = getImage();
    tempBox.Size = tempBox.Image.Size;
    tempBox.Tag = getValue();



        //THIS IS WHAT IS GIVING ME TROUBLE
        //=======================================================
    tempBox.MouseEnter += new EventHandler(Binder_MouseEnter);
    tempBox.Click += new EventHandler(smallCardNew_Click);



        //THINGS I'VE TRIED
    tempBox.BringToFront();
    tempBox.Focus();


    t1.Size = new Size();
    t2.Size = t1.Size; t3.Size = t1.Size; t4.Size = t1.Size;
    t1.Location = new Point();
    t2.Location = new Point(); t3.Location = new Point(); t4.Location = new Point();
    t1.Value = 0;
    t2.Value = 0; t3.Value = 0; t4.Value = 0; 
        t1.Enabled = true; t2.Enabled = true;
    t3.Visible = false; t4.Visible = false;


    //CREATE THE NEW PARENT CONTROL (PANEL)
    Panel tempPanel = new Panel();
    tempPanel.Margin = new Padding(0, 0, 0, 0);
    tempPanel.Controls.Add(tempBox);
    tempPanel.Controls.Add(t1);
    tempPanel.Controls.Add(t2);
    tempPanel.Controls.Add(t3);
    tempPanel.Controls.Add(t4);

    tempPanel.Size = new Size();
    tempPanel.Location = new Point();

    panel_book.Controls.Add(tempPanel);


}//end loop


///

void smallCardNew_Click(object sender, EventArgs e)
{
    MessageBox.Show("Click Event Triggered");
}
void Binder_MouseEnter(object sender, EventArgs e)
{
    MessageBox.Show("Mouse Enter Event Triggered");
}

Speriamo che, era chiaro, solo nel caso in cui il suo importante, ecco un contesto più ampio.

Ho una grande FlowLayoutPanel che contiene alcuni pannelli secondari.Uno di quei pannelli secondari è l'area su cui sto lavorando adesso.(chiamato panel_book sopra) che il pannello è quello che sto aggiunta dinamica di bambino, con pannelli PictureBox & amici.

La cosa fastidiosa è chi MouseEnter e fare Clic su eventi non sono sempre attivati.A tutti.Ho aggiunto i gestori di evento in fase di esecuzione prima, quando il controlli non erano dinamico, e non ho mai avuto questo gran fatica.Sono abbastanza sicuro che ho fatto anche questo con controlli nidificati come bene.

Infine, ho pensato di fare che i figli, l'ultimo pannello personalizzato di Controllo, ma hanno avuto problemi simili.Presumibilmente trovare il fix per questo problema sarà risolto anche quella, ma se sai che non, potrebbe, per favore, mi punto nella giusta direzione?

Grazie, :)

È stato utile?

Soluzione

Non vedo nulla di evidentemente sbagliato con il codice a parte la lista di "cose che ho sempre cercato" essere valido fino a quando il controllo, in realtà ha un manico (cioèviene aggiunto un genitore e tutti gli antenati hanno anche i genitori, salendo al livello di modulo);tuttavia, è necessario lavorare attraverso questo metodo, a partire dai più piccoli riproducibile caso invece di un grande blob di codice.

Il codice riportato di seguito non lavoro (per verificare, basta semplicemente un pulsante e il flusso del pannello in un Windows form):

private void button1_Click(object sender, EventArgs e)
{
    PictureBox pb = new PictureBox();
    pb.Location = new Point(0, 0);
    pb.Size = new Size(300, 300);
    pb.Image = SomeImage;
    pb.Click += new EventHandler(PictureBoxClick);

    Panel panel = new Panel();
    panel.Location = new Point(10, 40);
    panel.Size = new Size(300, 300);
    panel.Controls.Add(pb);

    flowLayoutPanel1.Controls.Add(panel);
}

private void PictureBoxClick(object sender, EventArgs e)
{
    MessageBox.Show("Picture box clicked");
}

Se eseguo questo codice e fare clic sul PictureBox, Ricevo un messaggio di errore casella di visualizzazione.Iniziare da qui, iniziare a fare questo guardare più come il codice vero e proprio, e alla fine verrà centrato il problema.

Qualunque sia il problema è che, non solo nel codice che hai postato, è nell'interazione con l'altro codice/elementi di design.

Altri suggerimenti

...

cosa

divertente. A quanto pare uno di quei controlli padre è stato disattivato. Fantasia che.

I ricreato circa la metà delle funzionalità su un diverso insieme di controlli e ottenuto che funziona. A quel punto mi sono reso conto del problema had per essere correlato a uno dei controlli, e non la logica.

Non ho idea di quando, come, o perché che il controllo ha disattivato, ma che va certamente al top delle mie 'cose stupide da controllare' lista. > _ <

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top