A: 

If you're not editing the data in the event handler of Class B, then simply have both class A and B subscribe to the event in C. If you're editing the data in B for A, then I'd recommend just calling a standard method in A with the data from B.

UPDATE: Based on your clarifications, I'd say just have 2 events - your socket (C) class fires an event when it has data, your socket manager (B) listens for this event and fires another, separate event when it has this data. Your form (A) listens for this event from B and acts on it. That makes your intent clear enough.

Matt Jacobsen
nope not editing data in B for A. just want to handle data in A.
Amitd
if subscribe to C's event in A doesn't it break encapsulation?
Amitd
You have an inheritance heirarchy? Edit your question to make this clear. I read your question as having 3 seperate classes, each creating an instance of the next.
Matt Jacobsen
done ..code added..no inheritance.
Amitd
Why are you doing this? If A, B, and C are independant of each other then they can fire events around as they please. If A is dependant on B's actions then make two completely separate events: one in C, which B listens for, and the other in B, which A listens for.
Matt Jacobsen
another thing: if your program only contains A, B and C then forget events. Use events when you don't know what is going to listen, if anything.
Matt Jacobsen
oh ok thx :) .. Actually A is Form which creates B which is SocketManager and C is the actual socket class which sends and receives data..when C receives data,i want to display it on the Form i.e. A .so I raised events from C->B->A.
Amitd
next time just write that!
Matt Jacobsen
does this change the answer? given 'Edit#2' .
Amitd
I've updated the answer again
Matt Jacobsen
+1  A: 

Based on my previous answer, it sounds like you have an inheritance heirarchy:

public class A
public class B : A
public class C : B

in which case you shouldn't use events for this. Rather, use base to call each base class.

class Program
{
    static void Main(string[] args)
    {
        C c = new C();
        c.DoStuff(0);
    }
}

public class A
{
    public virtual void DoStuff(int x)
    {
        Console.WriteLine(x);
    }
}

public class B : A
{
    public override void DoStuff(int y)
    {
        y++;
        base.DoStuff(y);
    }
}

public class C : B
{
    public override void DoStuff(int z)
    {
        z++;
        base.DoStuff(z);
    }
}

This example shows creation of your class C and its subsequent editing of data. This data is then passed on to B, which edits the data again before passing onto A.

Matt Jacobsen