Come ottenere il nome di un controllo sotto il puntatore del mouse (senza fare un gestore di eventi per ogni controllo)?
-
27-10-2019 - |
Domanda
Ho un mdichild e un eventHandler per DragandDrop, quindi quando abbandone un file di immagine nel mio modulo, viene creata una foto (name = dpic) con quell'immagine.
Ho un altro eventHandler che è per DPIC_Click, quindi quando faccio clic sull'immagine, il testo del mio modulo è il nome di quell'immagine.
Dopo la prima volta che lancio un'immagine, viene creato un altro DPIC, perché non puoi avere due Cotrol con lo stesso nome. C# cambia automaticamente il nome e questo fa funzionare i miei gestori di eventi solo per l'ultima immagine in cui ho lasciato. indietro l'immagine a cui sto indicando.
AGGIORNARE
Ecco il mio codice, ho creato un gestore di eventi per cadere nel mio mdichild:
void mdiChild_DragDrop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
dpic = new PictureBox() ;
string[] filepath = (string[])e.Data.GetData(DataFormats.FileDrop);
Image image = Image.FromFile(filepath[0]);
dpic.Image = image;
dpic.Tag = Path.GetFileName(filepath[0]);
this.ActiveMdiChild.Controls.Add(dpic);
dpic.ContextMenuStrip = this.contextMenuStrip1;
this.ActiveMdiChild.Refresh();
dpic.BringToFront();
this.ActiveMdiChild.ActiveControl = dpic;
dpic.Click += new EventHandler(dpic_Click);
// _____this helped me do it_________________________________________________
foreach (Control c in this.ActiveMdiChild.Controls)
{
c.Click += new EventHandler(c_Click);
}
// ________________________________________________________________________
}
}
Soluzione
Quello che stai cercando è un mittente. Il mittente dirà quale immagine è stata cliccata e ti permetterà di ottenere il suo nome.
PictureBox picSender = (PictureBox)sender;
label1.Text = picSender.Name;
EDIT: lo metti nell'evento Pic_Click
Altri suggerimenti
Non capisco esattamente cosa vuoi fare qui, possibilmente stratificando nuovi caselle di immagini con immagini cadute sul modulo?
Se è così puoi usare un file
List<PictureBox> picboxes = new List<PictureBox>();
E dove fai:
dpic = new PictureBox() ;
cambiare in
PictureBox dpic = new PictureBox() ;
picboxes.Add(dpic);
this.Controls.Add(dpic);
Ma si prega di notare che non è possibile disporre di controlli illimitati.