Sono obbligato a farlo dato che ad ogni roundtrip (come lo chiami tu) le combo sono svuotate dai campi...ho provato a mettere un if(!IsPostBack) e difatti i campi delle combo mi rimarrebbero vuoti.
Quindi devo ricompilare la prima combo tutte le volte.

codice:
private void Page_Load(object sender, System.EventArgs e)
{
	ddlProgetto.ID="ctl_1";
	ddlProgetto.AutoPostBack=true;
	ddlProgetto.Riempi(business.progetto.Componiprogetto(dbwrap.progetto.GetByFilter("")),"id_progetto","nome");

	ddlProgetto.Width=200;

	ddlLinea.AutoPostBack=true;
	ddlLinea.Width=200;
	ddlFase.Width=200;
}

		
private void calcolaCosto_Click(object sender, System.EventArgs e)
{	
	/// Calcolo dei costi e output dati su tabella.
}

private void ddlProgetto_SelectedIndexChanged(object sender, System.EventArgs e)
{
	if(ddlProgetto.ValoreIdLong!=0)
	{
		ddlLinea.Riempi(business.linea.Componilinea(dbwrap.linea_join.GetByFilter(" where progetto.id_progetto="+ddlProgetto.ValoreIdLong)),"id_linea","nome");
	}
}

private void ddlLinea_SelectedIndexChanged(object sender, System.EventArgs e)
{
	if(ddlLinea.ValoreIdLong!=0 && ddlProgetto.ValoreIdLong!=0)
	{
		ddlFase.Riempi(business.fase.Componifase(dbwrap.fase.GetByFilter(" where id_progetto="+ddlProgetto.ValoreIdLong)),"id_fase","nome");
	}
}
ddlProgetto è la prima combo
ddlLinea la seconda
ddlFase la terza.