152 messaggi dal 18 gennaio 2002
Ho risolto il problema di visualizzare in formato rtf (funziona anche per il formato doc... basta cambiare il ContentType ) una pagina aspx (ad es. per la stampa di una fattura) nel modo in fondo riportato.

Il problema ora è un altro: vorrei salvare il file su server... L'idea sarebbe quella di:
- creafile rtf
- contenuto del file =creastringa
- file.saveAs
avete qualche consiglio?



Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

creartf()
end sub


Sub creartf()
Try
Response.ContentType = "text/richtext"
Response.AddHeader("content-disposition", "attachment;filename=report.rtf")
Response.Clear()
Response.Write(creastringa)
Response.End()
Catch ex As Exception
Response.Write(ex.StackTrace & ex.Source & ex.Message)
End Try
End Sub


Function creastringa() As String
Try
Dim miostringahtml As String = ""
Dim miotesto As New StringWriter
Dim miotestohtml As New HtmlTextWriter(miotesto)
Me.RenderControl(miotestohtml)
miotestohtml.Flush()
miostringahtml = miotesto.ToString
Return miostringahtml
Catch ex As Exception
Response.Write(ex.StackTrace & ex.Source & ex.Message)
End Try
End Function

A proposito... qualcuno in qualche posto chiedeva come impostare i margini di stampa dell'rtf io ho risolto il problema in tal modo

<style type="text/css">
<!--

@page Section1
{
margin:1.0cm 2.0cm 1.0cm 2.0cm;
}
div.Section1
{page:Section1;}
-->
</style>
</head>
<body>
<div class=Section1><form ..>testo....</form></div>
3.165 messaggi dal 06 settembre 2002
Contributi | Blog
Ciao,

utilizza la classe StreamWriter.

1. la istanzi passando il nome del file.
2. ci scrivi dentro con il metodo write
3. salvi tutto col metodo close.

HTH
.

Nothing can be born from hartred

Stefano (SM15455) Mostarda
http://blogs.aspitalia.com/SM15455
Rome Italy
152 messaggi dal 18 gennaio 2002
grazie... ci studio sopra :)
152 messaggi dal 18 gennaio 2002
Ci siamo quasi... la fattura viene regolarmente salvata però mi viene visualizzato il seguente errore non gestito, quale è l'arcano mistero?

[HttpException (0x80004005): Una pagina può contenere solo un tag Form del lato server.]
System.Web.UI.Page.OnFormRender() +2069393
System.Web.UI.HtmlControls.HtmlForm.RenderChildren(HtmlTextWriter writer) +28
System.Web.UI.HtmlControls.HtmlForm.Render(HtmlTextWriter output) +68
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +25
System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +121
System.Web.UI.HtmlControls.HtmlForm.RenderControl(HtmlTextWriter writer) +37
System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +130
System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +24
System.Web.UI.Page.Render(HtmlTextWriter writer) +26
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +25
System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +121
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +22
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1896








Sub salvartf()
Try
Dim mionome As String = Server.MapPath("~/documenti/" & nomefile() & ".rtf")
Dim miofile As New StreamWriter(mionome, False, Encoding.Default)
miofile.Write(creastringa)
miofile.Close()
miofile = Nothing
Catch ex As Exception
Response.Write(ex.StackTrace & ex.Source & ex.Message)
End Try
End Sub
Function creastringa() As String
Try
Dim miostringahtml As String = ""
Dim miotesto As New StringWriter
Dim miotestohtml As New HtmlTextWriter(miotesto)

Me.RenderControl(miotestohtml)
miotestohtml.Flush()

miostringahtml = miotesto.ToString
Return miostringahtml
Catch ex As Exception
Response.Write(ex.StackTrace & ex.Source & ex.Message)
End Try
End Function

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Try
salvartf()

Catch ex As Exception
Response.Write(ex.StackTrace & ex.Source & ex.Message)
End Try
End Sub
mrub wrote:
[HttpException (0x80004005): Una pagina può contenere solo un tag Form del lato server.]

che, come ti dice la descrizione dell'errore, non puoi avere due form lato server.

Daniele Bochicchio | ASPItalia.com | Libri
Chief Operating Officer@iCubed
Microsoft Regional Director & MVP
152 messaggi dal 18 gennaio 2002
Con diverse lacune sì ... ma proprio pippaccia non sono  ...

la pagina contiene un solo tag form. Inoltre se utilizzo la sub creartf() al posto di salvartf() per la visualizzazione della fattura non ho alcun problema.

Sub creartf()
Try
Response.ContentType = "text/richtext"
Response.AddHeader("content-disposition", "attachment;filename=report.rtf")
Response.Clear()
Response.Write(creastringa)
Response.End()
Catch ex As Exception
Response.Write(ex.StackTrace & ex.Source & ex.Message)
End Try
End Sub

Ho passato tutta la domenica a cercare informazioni nei vari forum. Ho trovato alcune richieste simili alle mia tutte senza risposta. L'unico consiglio degno
di nota era quello di creare un htmlform, aggiungere i controlli all'htmlform e fare il render dell'html form. Premesso che la pagina è abbastanza complessa (pur contenendo solo controlli "renderizzabili" in HtmlTextWriter) vorrei evitare tale soluzione che, fra l'altro è tutta da verificare.

Al momento, dato che l'errore si verifica dopo che è stata salvata la fattura, ha aggirato il problema impostando la ErrorPage.

Mi piacerebbe, però, risolvere il busillis ... penso sia un caso interessante

il tutto potrebbe dipendere dalla chiamata

Me.RenderControl(miotestohtml) che, in qualche modo, faccia il rendering di qualche controllo generato in automatico dal framework.

In effetti guardando il codice html dell'rtf generato (utilizzando creartf()) alla fine della pagina trovo:


<p class=MsoNormal><span style='display:none;mso-hide:all'><INPUT TYPE="hidden" NAME="__VIEWSTATEENCRYPTED"
id="__VIEWSTATEENCRYPTED"></span></p>
</div>
</form>
</div>
</body>
</html>
in System.Threading.Thread.AbortInternal()
in System.Threading.Thread.Abort(Object stateInfo)
in System.Web.HttpResponse.End()
in contenzioso_user_stampafattura2.creartf() in c:\inetpub\wwwroot\xmediaweb\contenzioso\user\stampafattura2.aspx.vb:riga 18mscorlibThread interrotto.

...ed alla riga 18 c'è l'istruzione

Response.End() della sub creartf()


E' da ieri che mi ripeto - Mirko fregatene che hai una pila di lavori in sospeso - però non riesco a pensarci.

Datemi una soluzione o convincetemi che non vale la pena di perderci ancora tempo
mrub wrote:
Con diverse lacune sì ... ma proprio pippaccia non sono  ...

ok, l'ammetto, in certi momenti sono troppo stringato e dovrei essere più "discorsivo", ad ogni modo:

Me.RenderControl(miotestohtml)

questo genera il rendering di tutta la pagina (Me = questa classe, cioè la pagina) che ha già il rendering fatto e quindi, di fatto, ripete il rendering della form.

Datemi una soluzione o convincetemi che non vale la pena di perderci ancora tempo

fai il rendering di un contenitore che metti intorno a quello che ti interesssa renderizzare ed evita di farlo dell'intera pagina, dato che probabilmente non ti serve.

Daniele Bochicchio | ASPItalia.com | Libri
Chief Operating Officer@iCubed
Microsoft Regional Director & MVP
152 messaggi dal 18 gennaio 2002
In effetti ho fatto una prova simile facendo il rendering di un datalist contenuto nella pagina ...


... ma in questo caso mi viene restituito un errore del tipo "...impossibile effettuare il rendering perchè il controllo deve essere contenuto in un tag form "


... quindi il contenitore potrebbe essere un htmlForm?
Modificato da mrub il 18 febbraio 2008 15.15 -

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.