First off, try to make your code reflect the real world: if you have an elevator, it starts from the ground floor and goes up to the top floor - so make your array match that: index 0 is the ground floor, Length - 1 is the top floor.
That way, your code is much easier to read - particularly when your comments refer to "incrementing index" and the code actually subtracts!
Then make your names reflect their actual use: currentIndex is not as meaningful as "currentFloor".
Stop using hardcoded numbers as well:
if(currentIndex == 7)
only works if there are 7 floors - so if you need to work with a "taller building" later, your code is harder to maintain and that enas it's less reliable.
You don't say what the problem actually is, just
I have a problem making the code work for the reverse movement where the elevator is at the top and coming back down towards the ground floor.
so it's difficult to work out exactly what you see as a problem - and we can't run that code in isolation without some work to guess what you have done in terms of the picture boxes on your actual form that I don't really want to bother setting up a project for.
So ... instead I'm going to suggest that you use the debugger: put a breakpoint on the first line of the
ElevetorMover_Elapsed
method and watch what actually happens while your code is running. That should give you an idea why it's doing what you see.
But I can't help thinking you have overcomplicated this: An array, a targetFloor and a currentFloor would remplace the upward, res, and diff variables and make it easier to see:
if targetFloor == currentFloor you are done.
else if targetFloor > currentFloor you go up.
else you go down.
Why complicate it? You also don't need to test what floor you are on to decide what to paint: decolorise the current floor before you move, then colourise it after - the large
switch
with a lot of duplicated code is redundant (and it means that again, you can work with different building heights without changing your code!)