2013-02-17 14 views
8

Ho creato un'applicazione di gestione delle attività e volevo implementare la possibilità per 2 utenti di chattare su un'attività specifica.Il modo corretto per verificare se un modulo è già mostrato?

In Form1 Ho un timer che controlla il database per ogni nuovo messaggio inviato. Quando viene trovato un nuovo messaggio, appare il modulo di chat che mostra il messaggio.

Fino ad ora, tutto funziona come previsto ma ho solo un problema.

Il problema: Una volta che un nuovo messaggio trovato per la prima volta, viene visualizzata la finestra di chat, ma quando viene trovato un altro nuovo messaggio, appare un'altra finestra, e per ogni nuovo messaggio Ho una nuova istanza della chat finestra creata.

Il codice che sto usando:

List<string> tasksToDiscuss = checkForTasksToDiscuss(fullname); 

     if (tasksToDiscuss.Count > 0) { 
// open the chat window directly minimized 
Form14 frm14 = new Form14(); 
frm14.get_from = fullname; 
frm14.get_to = tasksToDiscuss[1]; 
frm14.get_task_id = int.Parse(tasksToDiscuss[3]); 
// set message as read 
if (setMessageAsRead(tasksToDiscuss[1], fullname, int.Parse(tasksToDiscuss[3]))) 
        { 
         // now show the chat window minimized 
         frm14.Show(); 
        } 

} 

Ho provato a sostituire la linea:
frm14.Show(); con frm14.ShowDialog();

Ho notato che quando si riceve il nuovo messaggio, la finestra di chat (form14) è mostrato, e quando viene ricevuto un altro messaggio dallo stesso utente, non appare nessuna nuova finestra di chat, ma il problema è che dopo aver chiuso la finestra di chat, non appare più nemmeno quando ricevo nuovi messaggi.

Quello che penso di fare è cambiare la finestra di chat (Form14.Text) nel nome utente completo, e la prossima volta che viene ricevuto un messaggio, controllo se la finestra specifica è già aperta, quindi non aprirla altrimenti mostro il modulo usando il metodo .Show().

È questo il modo corretto per fare in modo che la finestra non venga visualizzata se viene ricevuto un nuovo messaggio ed è già aperto? e Come controllare se una finestra viene aperta in base al suo testo (testo della barra del titolo)?

Grazie per aver dedicato del tempo a leggere la mia domanda. Qualsiasi aiuto sarebbe molto apprezzato

risposta

9

Per prima cosa si sta creando una nuova istanza di Form14 ogni volta che si riceve un nuovo messaggio.

In secondo luogo Show e ShowDialog fare due cose molto diverse:

Show mostra solo la forma, mentre ShowDialog visualizza il modulo come finestra di dialogo modale. Ciò significa che l'utente non può fare nient'altro fino a quando non congedano il modulo.

È necessario disporre di una singola istanza del modulo ed è possibile utilizzare la proprietà Visible per determinare se è visualizzata o meno.Così si avrebbe:

private Form14 frm14; 

Poi nel costruttore:

frm14 = new Form14(); 

Poi nel codice:

if (!frm14.Visible) 
{ 
    // Add the message 
    frm14.Show(); 
} else{ 
    // Top 
    frm14.BringToFront(); 
} 
+0

Il codice funziona come previsto. Ma cosa succede se ricevo un nuovo messaggio da un altro utente mentre sto già chattando con qualcun altro? –

+0

@ShikataGaNai In questo caso è necessario un elenco di moduli, uno per utente sul sistema. Sostituisci il modulo singolo con un dizionario o forse anche rendilo correttamente dall'utente. – ChrisF

3

Prova a creare form14 come membro di form1. Quando ottieni un nuovo messaggio, controlla la proprietà Visible di forom14 per sapere se è già visualizzato.

Problemi correlati