I bet your data is not entirely correct. I think one of the last / last entries throws an exception and is swallowed higher in your code (or not reported to your logger / user interface). It never ends the foreach and exits the method before you can assign your data source.
I would suggest that your second split, one of the entries does not actually contain your delimiter ,?; , so the show1 array is 1 in length and does not contain a "name" entry. When you try to access show1[1] , it throws an IndexOutOfRangeException .
Aside, can I suggest you investigate the use of simpler delimiters or, even better, use some form of XML serialization (or JSON or another) to read your data.
EDIT: I see from your published code in your comments that the problem is the last entry. Given hlj,?;lljhjh:?;hhmm,?;drr:?;oo,?;hello:?;ff,?;ff:?; , your first String.Split operation on :?; will result in an empty string as the last record. Thus, when you try to perform the second division on ,?; , it splits into empty ones and returns an array with a single String.Empty entry. When you press show1[1] , an exception will be thrown.
If you changed your first split to use StringSplitOptions.RemoveEmptyEntries , it should eliminate the empty entry:
string[] shows = text.Split(new[] { ":?;" }, StringSplitOptions.RemoveEmptyEntries);
If you like, you can add a check, for example if (show1.Length == 2) , then you can avoid bad data (but you might prefer to report it so you can fix it). If your program writes these bad data yourself, you may need to do some quick unit tests to make sure you always write / read reliable data.