[C#] - Stampa di un timesheet mensile

martedì 15 settembre 2009 - 15.33

Anonimo Profilo | Senior Member

Ciao a tutti!
Eccomi con l'ennesimo problema. Mi trovo ormai al completamento di un sito.
Su una pagina l'utente deve compilare un timesheet settimanale. Mi hanno chiesto di creare un'altra pagina in cui permetta la stampa del timesheet, ma in questo caso mensile, con una struttura simile a quello settimanale.
Siccome non sono esperto in c#/asp.net vorrei chiedervi un consiglio su come fare questo timesheet. Vi spiego meglio: mi piacerebbe che cliccando su un link mi chiedesse di salvare il ts mensile desiderato in locale, in formato .xls, quindi caricando tutti i dati richiesti da SQL Server, e mettendoli insieme facendo sì che mi visualizzi una tabella in formato mensile (righe clienti con le rispettive commesse, colonne giorni dall'1 al 28/29/30/31).
Qual è il metodo migliore per creare questa tabella a partire dai dati che ho?
Consigli?
Grazie anticipatamente a chi mi risponderà.

Anonimo Profilo | Senior Member

Up..

Gluck74 Profilo | Guru

ho in mente una soluzione; non so se sia la più pulita, ma credo sia veloce:

Crea una pagina con una gridview che carica i dati mensili che ti interessano
la pagina la fai vedere come preview con in fondo il bottone stampa
excel con questo codice:
protected void Stampa_Click(object sender, EventArgs e) { System.IO.StringWriter _sw = new System.IO.StringWriter(); HtmlTextWriter _hw = new HtmlTextWriter(_sw); this.GridView1.RenderControl(_hw); Response.Clear(); Response.ContentType = "application/vnd.ms-excel"; Response.AppendHeader("Content-Disposition", "attachment; filename=\"Export.xls\""); Response.AppendHeader("pragma", "no-cache"); Response.Buffer = true; Response.Expires = -1; Response.Write(_sw.ToString()); Response.Flush(); Response.End(); } public override void VerifyRenderingInServerForm(Control control) { // Confirms that an HtmlForm control is rendered for the // specified ASP.NET server control at run time. // No code required here. }

Gluck74 Profilo | Guru

se ti può essere utile leggi anche

http://forums.asp.net/p/1444234/3279378.aspx
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=118285

Anonimo Profilo | Senior Member

Intanto grazie della risposta!
Però non sono del tutto convinto che una gridview funzioni.
Ti faccio vedere un esempio:

http://img195.imageshack.us/img195/3663/immaginekw.jpg

Questa è la tabella che si usa già direttamente in Excel. Dici che è possibile fare una cosa del genere con sola la gridview?

Gluck74 Profilo | Guru

puoi agire sia sul controllo, ovvero direttamente nel gridview manipolando le celle,
sia sulla tebella finale, ovvero costruendo manualmente una tabella mentre scorri le righe del gridview.

Nel primo modo devi agire su GridView1_RowCreated e/o il metodo render per modificare le righe e/o aggiungere o modificare header ed altro.
Esempio:
protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.Header) { e.Row.SetRenderMethodDelegate(new RenderMethod(HeaderRenderMethod)); } }
Vedi articolo http://synthesis.net.pl/2008/03/19/OwnHeaderOfGridViewMultilineWithGroupingFromHtml.aspx


Nel secondo modo costruisci un HtmlTable come più ti piace
Esempio:
HtmlTable mytable = new HtmlTable(); generaHeader(_resultList.Columns, ref mytable); generaRighe(_resultList, ref mytable); private void generaHeader(DataColumnCollection Colonne, ref HtmlTable myTable) { HtmlTableRow tHead = new HtmlTableRow(); foreach (DataColumn colonna in Colonne) { string sClass = string.Empty; HtmlTableCell tCella = new HtmlTableCell("th"); tCella.InnerText = colonna.ColumnName; tHead.Cells.Add(tCella); } myTable.Rows.Add(tHead); } private void generaRighe(DataTable Sorgentedati, ref HtmlTable mytable) { foreach (DataRow row in Sorgentedati.Rows) { HtmlTableRow tRow = new HtmlTableRow(); string valore = string.Empty; string tipo = string.Empty; string sClass = string.Empty; string colName = string.Empty; for (int i = 0; i < row.ItemArray.Length; i++) { HtmlTableCell tCella = new HtmlTableCell("td"); valore = row[i].ToString(); tipo = row[i].GetType().Name; colName = Sorgentedati.Columns[i].ColumnName; //if (valore != string.Empty) //{ tCella.InnerText = valore; //} tRow.Cells.Add(tCella); } mytable.Rows.Add(tRow); } }
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5