PDA

View Full Version : [C#] Gestione eventi per una matrice di textbox dinamica


bestone
12-09-2007, 18:17
Ragazzi. qualcuno sa aiutarmi a scrivere il codice per gestire gli eventi di una matrice di textbox creati dinamicamente?
in pratica un applicazione windows form carica gli elementi di un db nelle textbox, quindi crea tante txtbox tante quanti sono i record. devo impostare l'evento Leave su ogni text box creata. sono riuscito a impostare l'evento ma si attiva solo sull'ultima txtbox creata perchè l'indice della matrice rimane all'ultima posizione dopo la creazione e il metodo dell'evento considera il suddetto indice. qualche consiglio?

RaouL_BennetH
13-09-2007, 10:01
Suppongo che tu abbia messo il tutto in un 'for' oppure in un foreach, per es.:



foreach(TextBox txt in tuo_controllo)
{
//codice relativo alla procedura di uscita
}

bestone
13-09-2007, 14:27
Ciao. esatto, un for che mi richiama il metodo che crea la matrice di txtbox e passa i dati, il numero totale, e le coordinate. nel metodo crea txtbox viene istanziato il gestore dell'evento che si attiva solo sull'ultima box creata per via dell'indice rimasto in memoria. come potrei ovviare?

RaouL_BennetH
14-09-2007, 09:40
Ciao. esatto, un for che mi richiama il metodo che crea la matrice di txtbox e passa i dati, il numero totale, e le coordinate. nel metodo crea txtbox viene istanziato il gestore dell'evento che si attiva solo sull'ultima box creata per via dell'indice rimasto in memoria. come potrei ovviare?

Non è che ti basterebbe azzerare l'indice? (senza uno spezzone di codice non sono sicuro di aver capito bene il problema :) )

bestone
14-09-2007, 14:11
Ciao. si ecco 2 frammenti di codice.

Questo è il metodo che crea la matrice e poi ogni singola txtbox, richiama anche il gestore dell'evento Leave, il metodo aggiorna. La variabile indexpublico è dichiarata prima del costruttore ed è visibile da qualsiasi metodo all'interno della classe. In pratica questa variabile dovrebbe passare l'indice di ogni singolo txtbox al metodo aggiorna, invece di avviare tanti gestori quanti sono le textbox, avvia solo 1 gestore evnto perchè aggiorna terrà conto solo dell'ultima valore della variabile indexpublico.
void crea_box(int x, int y, int n, int indice, string valuebox)
{
TextBox[] txtMatricebox = new TextBox [n];
txtMatricebox[indice] = new TextBox();
txtMatricebox[indice].Location= new Point(x, y);
Controls.Add(txtMatricebox[indice]);
txtMatricebox[indice].Text=valuebox;
indexpublico=indice;
txtMatricebox[indice].Leave+=new EventHandler(aggiorna);
}

legenda:
x, y= coordinate txtbox
n= dimensione arrray
indice= indice matrice
valuebox= testo della txtbox


qua viene richiamato il metodo per creare la matrice:
int xx=70;
int yy=50;
for (int i = 0; i < num; i++)
{
mio_datareader.Read();
string valuetxt=mio_datar1.GetString(1);
crea_box(xx, yy, num, i, valuetxt);
yy+=50;
}


all'inizio ho cercato di passare i valore come indexpublico come parametri al metodo aggiorna, ma EventHandler non lo permette. come dovrei ovviare?