Il datareader e' un oggetto legato alla connessione e al command che lo ha generato e quindi non e' molto corretto usarlo come valore di ritorno di una funzione che potrebbe essere benissimo sganciata appunto dalla connessione e dal command. Peraltro i valori contenuti all'interno di un datareader si leggono sempre e per forza dal primo all'ultimo e non si possono leggere invece come cerchi di fare tu.
Per queste ragioni, sarebbe forse piu' opportuno usare come valore di ritorno di una funzione una datatable es.
codice:
public sqldatatable GetDataTable(string SP)
.....
dtpagina = classe.GetDataTable(miaSP)
miotextbox.text = dtpagina.rows[0]["nomecolonna"].tostring();
oppure al limite una stringa (se non un object)
codice:
public string GetValueAsString(string SP)
// implementazione che usa la funzione executescalar
// del command e che poi ritorni una string
valpagina = classe.GetValueAsString(miaSP)
miotextbox.text = valpagina;