Coppie di oggetti

domenica 08 luglio 2012 - 09.03
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Windows 7  |  Windows Vista  |  Windows XP  |  Visual Studio 2010  |  Visual Studio 2008

avarrati Profilo | Newbie

Salve a tutti,
ho una form con 9 pulsanti e 9 checkbox ognuno in corrispondenza dell'altro.
vorrei sapere, se con una sola funzione posso fare questo:
clicco sulla checkbox e mi abilita il pulsante in corrispondenza (es. clicco la check1 e abilito il pulsante 1, clicco la check2 e abilito il pulsante2.. etc etc)
usando l'oggetto sender riesco a sapere quale check è stata cliccata e quindi estraggo il nome, prendo l'ultimo numero, ma non posso usare un oggetto il cui nome è, per così dire, "incognito" ..
qualcuno ha 1 idea a tal proposito?

grazie

InsettoScoppiettato Profilo | Junior Member

Le check Box contengono un evento CheckedChanged, ad ogni checkbox associ un handler the attiva o disattiva il pulsante relativo. L'evento CheckedChange in pratica deve contenere un If che verifica se la checkbox è flaggata oppure no, se è flaggata attiva il pulsante che vuoi con la proprietà button5.Enabled= true (ad esempio); il contrario se la checkbox non è flaggata. In fase di stesura del codice non ti servono nemmeno i nomi dei controlli, ti basta sapere il nome delle variabili a livello di codice.

Alessandro Parma

Vinsent Profilo | Senior Member

>Le check Box contengono un evento CheckedChanged, ad ogni checkbox
>associ un handler the attiva o disattiva il pulsante relativo.
>L'evento CheckedChange in pratica deve contenere un If che verifica
>se la checkbox è flaggata oppure no, se è flaggata attiva il
>pulsante che vuoi con la proprietà button5.Enabled= true (ad
>esempio); il contrario se la checkbox non è flaggata. In fase
>di stesura del codice non ti servono nemmeno i nomi dei controlli,
>ti basta sapere il nome delle variabili a livello di codice.
>
>Alessandro Parma
>

Quoto tutto, anche se non ho capito la parte in cui scrivi "In fase di stesura del codice non ti servono nemmeno i nomi dei controlli, ti basta sapere il nome delle variabili a livello di codice." In un modo o nell' altro devo romperti...

X avarrati:
non ho capito questo:
>usando l'oggetto sender riesco a sapere quale check è stata cliccata e quindi estraggo il nome, prendo l'ultimo numero, ma non posso usare un oggetto il cui nome è, per così dire, "incognito" ..
nello specifico, come fai a recuperare sender e cos' è "prendo l'ultimo numero"...puoi postare un codice di esempio o spiegare meglio?

Comunque, ho fatto qualcosa del genere con delle textbox, vedi esempio sotto. Il principio è quello postato da InsettoScoppiettato...solo che per evitare di scrivere il codice per ogni checkbox mi sono creato un "controllo utente" (non so se hai presente...) derivato da CheckBox aggiungendogli la proprietà "SetButton" per associargli il Button e una sub per gestire quest' ultimo.
Il controllo "modificato":
Public Class mia_checkbox Inherits CheckBox Dim buttn As Button Public Property SetButton As Button Get Return buttn End Get Set(value As Button) buttn = value End Set End Property Private Sub gestione_button() Handles Me.CheckedChanged If buttn Is Nothing Then Return Else If Me.Checked = True Then buttn.Enabled = True Else buttn.Enabled = False End If End If End Sub End Class

nella form bisogna impostare il Button della checkbox e lo stato:
Public Class Form1 Private Sub Form1_Load() Handles MyBase.Load Mia_checkbox1.SetButton = Button1 Button1.Enabled = False End Sub End Class
Vedi tu se può esserti utile come soluzione.
ciao










avarrati Profilo | Newbie

allora, innanzitutto ok grazie per le risposte
il problema è mio che mi son spiegato male, anche xkè ho semplificato di parecchio ciò che dovrei fare.
spendo qualche parolina in più..
ho 90 check box con i relativi 90 pulsanti .
il sistema funziona così:
si avvia la form e ci si ritrova con tutti sti oggetti dinanzi, di cui i pulsanti sono disattivati, mentre le check sono attivate.
quando io clicco su una check mi si apre un'altra form, in quest'ultima devo devo settare 14 oggetti tra radio button, combobox e textbox ed infine una volta premuto il pulsante di conferma, l'ultima form si deve chiudere e deve fare 3 cose, cioè:
- attivare il pulsante relativo alla checkbox attivata
- cambiare il nome del pulsante relativo alla checkbox flaggata (quindi form1.buttonxx.text=form2.combobox.selecteditem)
- dare il tag del pulsante relativo alla checkbox flaggata (quindi form1.buttonxx.tag=form2.textbox.text)
se invece deflaggo la check, il pulsante relativo si deve disattivare.

premesso ciò: ringrazio insettoscoppiettato (alessandro palma), ma è la soluzione che vorrei evitare in quanto 'lunga' infatti 'brutalmente' potrei fare 90 'eventi' (come avevo pensato di fare), uno per ogni checkbox, e quindi risolto così il problema (l'ho fatto solo per 9 .. ma mi son rotto e quindi preferisco cambiare strada), oppure cambiando strada uso l'oggetto sender, cioè quando clicco una qualsiasi checkbox sulla form1 (la funzione contiene gli handler di tutte le check) mi avvia la form2 e da quest'ultima riesco a sapere quale checkbox ho flaggato dalla form1; continuando su questa strada ho pensato che ora potrei isolare l'ultima cifra del sender per capire a quale pulsante associare le informazioni, ma non posso usare l'oggetto "button & ultime_cifre_del_sender" in quando mi dice che non esiste un oggetto con questo nome (e c'ha ragione)..

grazie vinsent, so cosa è un controllo utente (ne ho creato qualcuno anch'io) solo che nn sapevo su che strada crearlo.. nel tuo caso però dovrei associare ogni checkbox al suo button, quindi 90 righe da scrivere... inoltre non fa solo ciò che dovrebbe fare (colpa mia perché le informazioni che ho dato erano incomplete ed inesatte)..

attualmente ho adottato la seguente strada.. con un buon risparmio di righe di codice direi..

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

ovviamente sulla form2 esistono queste righe (nei punti giusti)
Public Trasponder As Object = New Button Trasponder.Tag &= "impostazione del tag" Trasponder.Text =" impostazione del testo" Close()

questa mia strada scelta funziona e fa ciò che volevo..

ditemi cosa ne pensate, magari eventualmente anche la complessità utilizzata e la pesantezza della struttura .. sarei favorevole a creare un controllo, ma mi perso sempre da qualche parte... quindi per il momento ho raggiunto il mio obiettivo e ho abbandonato quella strada..

in ogni caso grazie a tutti :)

Vinsent Profilo | Senior Member

Adesso ho capito!
Per il discorso di richiamare un' oggetto per "nome" puoi usare ad esempio:
Me.Controls("Button" & "1").Enabled = False
Con un ciclo sui controlli puoi benissimo evitare di scrivere a mano tutto il codice per associare i vari controlli tra di loro o a degli eventi:
For a = 0 To Me.Controls.Count - 1 If TypeOf Me.Controls(a) Is CheckBox Then 'prendo il numero della checkbox... numero = Me.Controls(a).Name.Remove(0, 8) 'imposto il testo del button con il nome della checkbox ' e il suo stato Me.Controls("Button" & numero).Text = Me.Controls(a).Name Me.Controls("Button" & numero).Enabled = False 'associo gli eventi ad una sub AddHandler Me.Controls(a).Click, AddressOf 'tua sub AddHandler Me.Controls("Button" & numero).Click, AddressOf 'tua sub End If Next
Per comodità potresti anche aggiungere i due controlli a delle liste e con una funzione ricavare uno dall' altro. In pratica potresti scrivere tutto il codice senza mai richiamare direttamente un controllo...
Per il controllo utente...è più semplice di quanto sembri...sopratutto se checkbox e button sono uno di fianco all' altro, se vuoi posso farti un' esempio.
Comunque la tua soluzione mi sembra ok...anche se non ho molto esperienza per giudicare...
ciao

avarrati Profilo | Newbie

wow grazie!! era quella più o meno un pezzo di quella funzione li che mi mancava :D
cmq se hai modo di fare un esempio lo accetto ben volentieri.
nel mio caso la checkbox sta sempre sopra il button :)
cmq tranqui, anch'io non ho moltissima esperienza.. però il codice che ho fatto funziona.. il 'guaio' potrebbe essere che in alcuni pc vecchiotti, la sua esecuzione potrebbe risultare lenta.. anche se non so fino a che punto :)

cmq grazie ancora di nuovo :)

Vinsent Profilo | Senior Member

Vedi il progetto allegato.
ciao

avarrati Profilo | Newbie

ok grazie! capito cosa hai fatto ed è anche molto semplice :)

una cosa.. se io adesso volessi aggiungere una property a quell'oggetto, come dovrei fare?
ad esempio, clicco su ok nella form2 e mi imposta form1.mio_controllo.trottola = 25 (scrivo 25 per dire una scemenza, ovviamente questo 'trottola' non esiste, potrei aggiungerlo in qualche modo? facciamo magari finta per ipotesi che trottola = "form1.
ad esempio la property mio_controllo.trottola ?

(in realtà ciò è un'anticipazione x 1altra cosa..)

Vinsent Profilo | Senior Member

Prendi come esempio le property già dichiarate nel controllo...dichiara una variabile con il tipo Form, fai copia/incolla di una property a caso...e sostituisci nomi e tipi...
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5