Hello.
Even with relatively small number of items, I would definitely recommend to subscribe to all items at once (prepare the arguments upfront, and then call SubscribeMultipleItems). There are performance problems when doing it one by one. The events that get generated afterwards are the same as if you had used SubscribeItem individually.
With small number of items as yours, you can (in the ItemChanged event handler) test ItemDescriptor.ItemId sequentially against specific known values, as you have suggested. For effective code in larger applications, there are different approaches, making use of the State argument (property). This is an arbitrary object that you pass to the component when making a subscription to an OPC item, and that you receive with each event notification related to that item. This can be used to various things; in the HmiScreen example, we pass in the reference to control to be updated, and when the item changes, we can directly update that control. Other uses might be e.g. to pass in a delegate to a method that would process that particular OPC item, or a PropertyInfo obtained by reflection and determining which property needs to be set.
DAVtq.DisplayValue() returns a string. The string contains the value (if available), together with timestamp and quality informayion, all expressed in one string. If you have typed properties (not just strings), you may consider typecasting DAVtq.Value to an appropriate type instead; in this case, you need to be aware that in some cases (e.g. Bad quality), the Value may not be available and is a null reference.
If you decide to do reading (as opposed to subscriptions), you can either use the fact that arguments in the output array of ReadMultipleItem[Value]s have the same indices as input arguments, or you can also use the State property - see e.g.
www.opclabs.com/Support/Online... .
Best regards,