Hello,
dans la série des galères matinales, j'ai un souci de delegate ...
Tous les exemples que j'ai put trouver utilisent des threads déclarés dans la même classe.
Là je dois utiliser un thread déclaré dans une classe autre que celle du Form1.
En gros j'ai :
Form1 qui instancie un objet 'client' qui lui lance un Thread ( la méthode de ce thread est définie dans une troisième classe).
Le Thread doit pouvoir mettre à jour un datagrid présent sur la form1.
Afin que mon Thread connaisse le Datagrid, je passe ce datagrid à ma classe client, qui le passe a son tour a ma classe clientThread. ( ca déjà ca doit pas être tiptop ? )
J'ai donc écrit une méthode public dans ma classe Form1,
public void UpdateDatagrid(ArrayList List){...}
et un delegate
public delegate void UpdateDataGridDelegate(ArrayList List);
et j'appelle le delegate ainsi ( dans ClientThread ), avec dg le datagrid:
dg.Invoke(new mainForm.UpdateDataGridDelegate(UpdateDatagrid), List);
j'ai comme erreur :
The name 'UpdateDatagrid' does not exist in the current context
Moi je veux bien, mais il est public, il y a un delegate, je vois pas trop ce qu'il lui faut de plus ?
un petit appercu des classes pour comprendre peut etre mieux que mon charabia, j'ai beaucoup simplifié le code, en ne gardant que ce qui me semblai t nécessaire à sa comprehension :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 public partial class mainForm : Form { ... private Client clientAlarms; public delegate void UpdateDataGridDelegate(ArrayList List); ... public mainForm() { InitializeComponent(); InitializeApplication(); .... } private void InitializeApplication() { ... clientAlarms = new ClientOptimAlarm(confMng.Server); clientAlarms.DataGrid = dataGrid1; ... } } public void UpdateDatagrid(ArrayList List) { // au moins pour debug dataGrid1.DataSource = null; dataGrid1.Refresh(); dataGrid1.DataSource = List; dataGrid1.Refresh(); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 class Client { private ClientThread thread; private Thread t; ... private DataGrid dg; ... public DataGrid DataGrid { set { dg = value; } } ... public void Connect() { ....... try { thread = new ClientThread(ipEndPt); thread.DataGrid = dg; t = new Thread(new ThreadStart(thread.RetrieveAlarms)); t.IsBackground = true; t.Start(); } catch (Exception e) { ...... } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 class ClientThread { ... private DataGrid dg; ... public DataGrid DataGrid { set { dg = value; } } .... private void AddAlarm(AlarmEventSlave Alarm, ArrayList List) { foreach (AlarmEventSlave al in List) { if (al.IndexAlarmeEvent == Alarm.IndexAlarmeEvent) { List.Remove(al); break; } } List.Add(new AlarmEventSlave(Alarm)); dg.Invoke(new mainForm.UpdateDataGridDelegate(UpdateDatagrid), List); } }
Partager