salve a tutti
dovrei unire celle o colonne, in asp mi bastava impostare il "colspan" oppure "rowspan" e aggiungere mano mano le righe o colonne nella colonna,riga successiva
in asp.net č possibile fare una cosa del genere? se si come?
grazie
salve a tutti
dovrei unire celle o colonne, in asp mi bastava impostare il "colspan" oppure "rowspan" e aggiungere mano mano le righe o colonne nella colonna,riga successiva
in asp.net č possibile fare una cosa del genere? se si come?
grazie
NN vi diro mai chi sono in realta,
tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me
Io non userei nč l'uno nč l'altro ma farei una table a mano. Perō, tempo fa, in questo forum ho visto questo esempio che ti ripropongo. L'esempio crea una riga di intestazione unendo due colonne.
codice:<%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> protected void Page_Load(object sender, EventArgs e) { ModuloWeb.DataBind(this.GridView1, MioModulo.StringaConnessioneTest, "SELECT * FROM REGIONI ORDER BY NOME_REGIONE", new string[] { "codice_istat_regione" }); } protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e) { //reindirizzo il metodo render predefinito al metodo personalizzato if (e.Row.RowType == DataControlRowType.Header) e.Row.SetRenderMethodDelegate(CreaIntestazione); } private void CreaIntestazione(HtmlTextWriter writer, Control ctl) { //non c'č bisogno di <tr> perchč il writer lo mette in automatico writer.Write("<td colspan=\"2\" align=\"center\" style=\"color:darkblue;background-color:#99ccff\" >CAMPI</td>"); writer.Write("</tr>"); this.GridView1.HeaderStyle.AddAttributesToRender(writer); //ricostruisco la testata originale generata da gridwiew writer.RenderBeginTag("tr"); int ind = 0; while (ind <= ctl.Controls.Count - 1) { ctl.Controls[ind++].RenderControl(writer); } //non c'č bisogno della chiusura </tr> perchč il writer lo mette in automatico } </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Pagina senza titolo</title> <link href="../../../../stili/Styles.css" rel="stylesheet" type="text/css" /> </head> <body> <form id="form1" runat="server"> <asp:GridView ID="GridView1" runat="server" EnableViewState="false" CellPadding="4" ForeColor="#333333" GridLines="None" OnRowCreated="GridView1_RowCreated"> <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> <RowStyle BackColor="#F7F6F3" ForeColor="#333333" /> <EditRowStyle BackColor="#999999" /> <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" /> <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" /> <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> <AlternatingRowStyle BackColor="White" ForeColor="#284775" /> </asp:GridView> </form> </body> </html>
Pietro
ciao
provando il tuo codice (scusa del ritardo, ma mi avevano associato ad un'altra attivita')
ho cercato di tradurlo in vb.net
ma nella parte di codice che richiama la funzione "CreaIntestazione(HtmlTextWriter writer, Control ctl)",mi da un errore in quanto vuole che gli passi un argomento
mentre nel tuo codcie non gli passi nessun argomento
o il c# funzona diversamente (ma non mi pare)
oppure ho sbagliato qualcosa io,quindi visto che mi sto impappinando mi puoi spiagar ecome mai non passi nessun argomento e pare che ti funziona bene?
grazie
NN vi diro mai chi sono in realta,
tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me
il metodo SetRenderMethodDelegate, ha come argomento un delegate.
in c# la sintassi č:
e.Row.SetRenderMethodDelegate(CreaIntestazione);
dove CreaIntestazione č il puntatore (indirizzo) della funzione
Purtroppo in basic la sintassi č prolissa:
e.Row.SetRenderMethodDelegate(AddressOf CreaIntestazione)
la traduzione, se sei ancora interessato č:
codice:<%@ Page Language="VB" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) libreria.DataBind(Me.GridView1, MioModulo.StringaConnessioneTest, "SELECT * FROM REGIONI ORDER BY NOME_REGIONE", New String() {"codice_istat_regione"}) End Sub Protected Sub GridView1_RowCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) If (e.Row.RowType = DataControlRowType.Header) Then e.Row.SetRenderMethodDelegate(AddressOf CreaIntestazione) End If End Sub Private Sub CreaIntestazione(ByVal writer As HtmlTextWriter, ByVal ctl As Control) '//non c'č bisogno di <tr> perchč il writer lo mette in automatico writer.Write("<td colspan=""2"" align=""center"" style=""color:darkblue;background-color:#99ccff"" >CAMPI</td>") writer.Write("</tr>") Me.GridView1.HeaderStyle.AddAttributesToRender(writer) '//ricostruisco la testata originale generata da gridwiew writer.RenderBeginTag("tr") Dim ind As Integer = 0 Do While (ind <= ctl.Controls.Count - 1) ctl.Controls(ind).RenderControl(writer) ind += 1 Loop '//non c'č bisogno della chiusura </tr> perchč il writer lo mette in automatico End Sub </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Pagina senza titolo</title> </head> <body> <form id="form1" runat="server"> <asp:GridView ID="GridView1" runat="server" EnableViewState="false" CellPadding="4" ForeColor="#333333" GridLines="None" OnRowCreated="GridView1_RowCreated"> <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> <RowStyle BackColor="#F7F6F3" ForeColor="#333333" /> <EditRowStyle BackColor="#999999" /> <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" /> <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" /> <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> <AlternatingRowStyle BackColor="White" ForeColor="#284775" /> </asp:GridView> </form> </body> </html>
Pietro
wow č vero
avevo ragione tu,infatti cosi' funziona
ma da quello che noto č che questo codice aggiunge un'intestazione in modo da craere un tag <td> che comprende 2 celle
mentre io ne voglio unire 2 celle o righe gia' esistenti,ho fatto un po' di test e dopo i primi rincoglionimenti riposto qui![]()
NN vi diro mai chi sono in realta,
tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me
Ho un esempio fatto col GridView. Non so a che serva, ma se si vogliono unire colonne, credo che funzioni.
codice:Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound Select Case e.Row.RowType Case DataControlRowType.Header Dim tcc As TableCellCollection = e.Row.Cells Dim nTotalCols As Integer = tcc.Count For i As Integer = nTotalCols - 1 To 1 Step -1 e.Row.Cells.RemoveAt(i) Next Dim c As TableCell = e.Row.Cells(0) c.ColumnSpan = nTotalCols c.Text = "Id regione e nome regione" Case DataControlRowType.DataRow Dim tcc As TableCellCollection = e.Row.Cells Dim nTotalCols As Integer = tcc.Count For i As Integer = nTotalCols - 1 To 1 Step -1 e.Row.Cells.RemoveAt(i) Next Dim c As TableCell = e.Row.Cells(0) c.ColumnSpan = nTotalCols Dim dr As System.Data.Common.DbDataRecord = DirectCast(e.Row.DataItem(), System.Data.Common.DbDataRecord) c.Text = "Id regione = " & dr(0).ToString() & ", Nome regione = " & dr(1).ToString() End Select End Sub
Pietro
Vorrei consigliarti di tentare usando le proprietā del gridview TemplateColumn
Ti posto un esempio che puoi adattare alle tue esigenze ma ti consiglio di studiart l'oggetto
come sto facendo io Qui
codice:<asp:datagrid id="dgPopularFAQs" runat="server" AutoGenerateColumns="False"> <Columns> <asp:BoundColumn DataField="FAQID" ItemStyle-Width="10%" ItemStyle-HorizontalAlign="Center" HeaderText="FAQ ID" /> <asp:TemplateColumn HeaderText="FAQ Information"> <ItemTemplate> <table border="0"> <tr> <td align="right">Description:</td> <td><%# DataBinder.Eval(Container.DataItem, "Description") %></td> </tr> <tr> <td align="right">Category Name:</td> <td><%# DataBinder.Eval(Container.DataItem, "CatName") %></td> </tr> <tr> <td align="right">View Count:</td> <td><%# DataBinder.Eval(Container.DataItem, "ViewCount", "{0:#,###}") %> </td> </tr> </table> </ItemTemplate> </asp:TemplateColumn> </Columns> </asp:datagrid>
ok funziona
ora ho una difficilta'
purtroppo quando ciclo gli elementi della datagrid, se ho una colonna template con una combo non riesce a prendermi il valore dentroma solo alla prima occcorenza dell'unione
infatti il findcontrol("controllo") non genera errore ma se faccio text da sempre vuoto
cosa posso fare?
NN vi diro mai chi sono in realta,
tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me
sinceramente non ho capito quel che intendi fare,sorry
ciao
ti posto il codice dwella funzione che riesce a unire le celle , la funzione vuole il numero colonna come parametro e unisce le celle in base lla colonna,se trova le stesse occorrenze
il guaio di questa funzione č che nonostanze sembri funzionare, se si ha nel datagrid una colonna template con una combobox e si tenta di ciclare la grigglia, riusciresti solo a prendere la prima occorrenza della combo,se in una cella prima č stata unitacodice:Public Sub UnisciColonneDatagrid(ByVal DG As DataGrid, ByVal Col As Int16) Dim i As Integer Dim Sapp As String = "" Dim Ssucc As String = "" Dim conta As Int16 = 1 'conta le occorrenze Dim cc As TableCell For i = 0 To DG.Items.Count - 1 Sapp = DG.Items(i).Cells(Col).Text If i = DG.Items.Count - 1 Then '-----ultima riga If Ssucc = Sapp Then DG.Items(i).Cells.RemoveAt(Col) cc.RowSpan = conta ' - 1 '+ 1 cc.Text = Sapp DG.Items(i - conta + 1).Cells.AddAt(Col, cc) '- conta End If GoTo continua'sostituire con variabile bool Else Ssucc = DG.Items(i + 1).Cells(Col).Text End If If Sapp = Ssucc Then 'Or (Ssucc = Sapp) Then 'And Sprec <> "" conta = conta + 1 cc = DG.Items(i).Cells(Col) DG.Items(i).Cells.RemoveAt(Col) ElseIf Sapp <> Ssucc And conta > 1 Then DG.Items(i).Cells.RemoveAt(Col) cc.RowSpan = conta ' - 1 '+ 1 cc.Text = Sapp DG.Items(i - conta + 1).Cells.AddAt(Col, cc) '- conta conta = 1 'resetto il conta End If continua:'da eliminare Next End Sub
grazie
p.s.
la funzione ovviamente č da migliorare,quindi non guardare le ottimizzazioni, ma solo dove genera questa fastidioso errore,e mi riferisco ache ad "on error..."
NN vi diro mai chi sono in realta,
tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me