Catturare l'evento click su qualsiasi pulsante dell'applicazione

venerdì 08 aprile 2011 - 16.03
Tag Elenco Tags  VB.NET  |  .NET 2.0  |  Windows XP  |  Visual Studio 2005

Barabas Profilo | Junior Member

Salve,
nella mia applicazione realizzata in VB.net con VisualStudio 2005 vorrei generare un log delle operazioni compiute dall'utente, tenendo traccia di tutti i bottoni che vengono cliccati.
ma non posso mettere nell'handle del metodo tutti i bottoni, sono semplicemente troppi.
Come potrei fare?
Ho già iniziato col vedere gli eventi mybase.click e me.click non vengono lanciati quando si clicca su un pulsante.
Ogni suggerimento è ben accetto.
Grazie



Barabas

AntCiar Profilo | Expert

Ciao.

Così su due piedi mi viene in mente questo: nel progetto di livello più basso (nel caso sono più di uno) inserisci una classe che eredita da un Button che chiamerai per esempio MyButton.

All'interno di questa classe gestisci l'evento click dove inserisci il tuoi codice che va a scrivere nel log. Poi con un trova e sostituisci cambia tutti i riferimenti a Button con MyButton. in questo modo quando farai click su un MyButton, oltre ad eseguire l'evento che c'è associato sulla form, esegue quello di base che ti va a scrivere l'informazione nel log.
Cristian Barca

Barabas Profilo | Junior Member

in effetti ci avevo pensato e stavo provando

ma quando scrivo "inherits button" mi dà questo errore che non capisco
La classe base 'System.Windows.Forms.Button' specificata per la classe 'myButton' non può essere differente dalla classe base 'System.Windows.Forms.UserControl' di uno degli altri tipi parziali.
sto cercando di capire quali siano questi tipi parziali...
Barabas

AntCiar Profilo | Expert

Questo errore è strano. Non saprei dirti nemmeno io quali sono questi tipi parziali.
Posta un po di codice perchè è veramente strana sta cosa. Ereditare da un Button non deve dare problemi.
Cristian Barca

Barabas Profilo | Junior Member

ho poco da postare io ho scritto solo questo:

Public Class MyButton
Inherits Button
End Class

devo premettere:
ho cliccato col destro sul progetto principare e ho selezionato:
Aggiungi->Nuovo Elemento ->
tra gli elementi da poter aggiungere c'è "Controllo Utente (controllo Windows Form riutilizzabile) " e c'è "Controllo Utente Ereditato (Nuovo controllo basato su un controllo Windows Form esistente) ".
ho pensato che il secondo fosse quello adatto, ma quando l'ho selezionato è comparsa la finestra "Selezione Ereditarietà" che diceva quest'altra frase astrusa: "Avviso: nessun assembly generato che contiene componenti da cui ereditare. Generare l'applicazione corrente oppure fare click sul pulsante Sfoglia e selezionare un assembly precedentemente generato da un'altra applicazione."

Sotto c'era il pulsante sfoglia, il pulsante ok grigiato e il pulsante annulla. Se non seleziono con sfoglia una DLL di suo gradimento non mi fa andare avanti, ma io non so cosa vuole. Ho anche provato a generare l'applicazione corrente ma non è cambiato nulla.

quindi ho annullato e selezionato l'altra voce: Controllo Utente.
si apre la finestra di progettazione, visualizzo il codice, ci scrivo che eredita Button e dà l'errore.
Cosa sto sbagliando?
Barabas

kataklisma Profilo | Senior Member

>Salve,

Ciao :)

>nella mia applicazione realizzata in VB.net con VisualStudio
>2005 vorrei generare un log delle operazioni compiute dall'utente,
>tenendo traccia di tutti i bottoni che vengono cliccati.
>ma non posso mettere nell'handle del metodo tutti i bottoni,
>sono semplicemente troppi.
>Come potrei fare?
>Ho già iniziato col vedere gli eventi mybase.click e me.click
>non vengono lanciati quando si clicca su un pulsante.
>Ogni suggerimento è ben accetto.

Devi semplicemente creare una nuova classe (Click destro sul progetto -> Add -> Class) che eredita da Button ed effettuare l'override del metodo OnClick :

public class MyButton : Button { protected override void OnClick(EventArgs e) { base.OnClick(e); MessageBox.Show("Prova"); } }

In VB.Net dovrebbe tradursi in :

Public Class MyButton : Inherits Button Protected Overrides Sub OnClick(ByVal e As System.EventArgs) MyBase.OnClick(e) MessageBox.Show("Prova") End Sub End Class

Ovviamente devi sostituire al MessageBox di esempio il codice utilizzato per il Log....

>Grazie

Di nulla :)

------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

Barabas Profilo | Junior Member

mi sembra una buona idea, ma poi come faccio a dichiarare un bottone di questo tipo?

Barabas

kataklisma Profilo | Senior Member

>mi sembra una buona idea, ma poi come faccio a dichiarare un
>bottone di questo tipo?

Compila la soluzione, riavvia Visual Studio e dovresti trovarlo nella ToolBox come quasiasi altro Controllo Utente, oltre ovviamente a poterlo dichiarare come un quasiasi oggetto nel sorgente :

MyButton Prova = new MyButton(); Prova.Height = 100; etc... this.Controls.Add(Prova);

Spero ti sia stato d'aiuto :)

Buona giornata.

------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

AntCiar Profilo | Expert

Ciao.

Come ha detto Kataklisma, puoi trovarlo nella toolbox, oopure per convertire i bottoni già esestenti basta sche fai un trova e sostituisci sostituendo "Button" con "MyButton"
Cristian Barca

Barabas Profilo | Junior Member

funzionano entrambi i sistemi suggeriti, solo che bisogna prima riavviare il visual studio, altrimenti niente.
Grazie
Barabas

kataklisma Profilo | Senior Member

>funzionano entrambi i sistemi suggeriti, solo che bisogna prima
>riavviare il visual studio, altrimenti niente.

Già, ho notato più volte questo "Bug" di VS (2005/2008/2010), il controllo personalizzato non viene riconosciuto finché non si compila la Solution (e fin qua ci siamo...) e si riavvia l'IDE....

>Grazie
Di nulla :) Ciao!

Se hai bisogno, noi siamo qui ;)

------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5