Attaccare un controllo ascx in una pagina aspx

giovedì 16 aprile 2009 - 10.54

queengab Profilo | Newbie

Ciao a tutti,

domanda molto banale.. ma per me super niubbo estramamente complicata da risolvere... Ho un controllo ascx... Lo vorrei provare in locale tramite il server di visual studio ma mi da il soltio problema di visualizzazione di un ascx.. allora ho pensato mi faccio una pagina asp farlocca e ce lo faccio partire di la.... ma come?

Su quae file devo mettere il rimando aspx oppure aspx.cs e come? Ho cercato in girop un po' di guide ma non è che ci ho capito poi tanto...

A presto
Gabriele

paoval72 Profilo | Senior Member

Ciao. Scusa, ma forse non ho capito bene cosa vorresti fare. Vuoi inserire un controllo ascx in una pagina aspx?
Se è così, basta registrare l'ascx sull'html(la pagina aspx contenitore).
Tipo:
<%@ Register TagPrefix="mioprefisso" TagName="mionometag" Src="miapagina.ascx" %>

Poi, dal menu a tendina dei tag dovresti trovare incluso anche il tuo nuovo controllo, che potrai inserire come un qualsiasi altro campo html:
<mioprefisso:mionometag id="idscelto" runat="server"></mioprefisso:mionometag >
Era questo che cercavi?

PV



queengab Profilo | Newbie

yes esattamente!

Ma al posto tagprefix e tagname che ci devo inserire?

Secondo dove lo vado a richiamare il tag?

Perdonami ma incontro davvero tante difficoltà...


Gabriele

caprikorn Profilo | Newbie

Ciao, mi intrufolo ... :)

al posto di tagprefix e tagname metti un nome a tua scelta, ad esempio:

<%@ Register TagPrefix="pippo" TagName="pluto" Src="miapagina.ascx" %>

Il controllo lo richiami nel punto in cui vuoi che appaia il contenuto del controllo ascx, ad esempio:

<html> <head> <title>Prova</title> </head> <body> <form id="myform" runat="server"> Ciao di seguito troverò il contenuto del controllo ascx:<br /><br /> <pippo:pluto id="idcontrollo" runat="server"></pippo:pluto> </form> </body> </html>

paoval72 Profilo | Senior Member

>yes esattamente!
Ok, allora siamo a posto!
>Ma al posto tagprefix e tagname che ci devo inserire?

i due nomi degli attributi li scegli tu: infatti, io ti ho messo "mionomeprefisso" e "mionometag" come esempio. Qui sopra, nell'altro post, hanno messo pluto e pippo. Scegli tu quel che ti è più comodo o che meglio ti ricorda l'ascx. Puoi anche chiamarli "a" e "b"., ma sarebbe meglio qualcosa di più significativo!

>Secondo dove lo vado a richiamare il tag?
Se ci posti un po' di codice html e ci dici in che punto della pagina vuoi far comparire l'ascx, non ci sono problemi

PV

queengab Profilo | Newbie

Grazie per le vostre risposte...

Ho inserito il @register ma mi da questo errore

Errore di compilazione
Descrizione: Errore durante la compilazione di una risorsa necessaria per soddisfare la richiesta. Rivedere i dettagli relativi all'errore e modificare in modo appropriato il codice sorgente.

Messaggio di errore del compilatore: BC30456: 'GridView1_RowCommand' non è un membro di 'ASP.webusercontrol1_ascx'.


La pagina html dove inserisco il controllo è una semplcissima pèagina con body... E' solo per fare una prova e vedere se il controllo funziona... Il controllo è una gridviw per andare ad aagiungere delle righe in und che sta su sql server. Una volta visto se fuzniona oppure no dovrò esportare il controllo per usarlo su umbraco un cms open source in asp.net che utilizza controlli ascx...

Grazie di tutto siete davvero gentili
Gabriele

paoval72 Profilo | Senior Member

Puoi postare il codice html dell'aspx e quello dell'ascx?
PV

queengab Profilo | Newbie

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication3._Default" %>
<%@ Register src="~/WebUserControl1.ascx" tagname="WebUserControl" tagprefix="uc" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form" runat="server">
Ciao di seguito troverò il contenuto del controllo ascx:<br /><br />
<uc:WebUserControl id="idcontrollo" runat="server"></pippo:pluto>
<div>
<p> Ciao sto facendo una prova</p>

</div>
</form>
</body>
</html>

Controllo ascx

<asp:GridView ID="GridView1" runat="server" BackColor="White"
BorderColor="#3366CC" BorderStyle="None" BorderWidth="1px" CellPadding="4" AllowSorting="True" AutoGenerateColumns="False" ShowFooter="True" OnRowCommand="GridView1_RowCommand">
<FooterStyle BackColor="#99CCCC" ForeColor="#003399" />
<RowStyle BackColor="White" ForeColor="#003399" />
<PagerStyle BackColor="#99CCCC" ForeColor="#003399" HorizontalAlign="Left" />
<SelectedRowStyle BackColor="#009999" Font-Bold="True" ForeColor="#CCFF99" />
<HeaderStyle BackColor="#003399" Font-Bold="True" ForeColor="#CCCCFF" />
<Columns>
<asp:BoundField DataField="PersonID" HeaderText="PersonID" />
<asp:TemplateField HeaderText="Name">
<ItemTemplate>
<asp:Label ID="Label1" Text='<%# Eval("Name") %>' runat="server"></asp:Label>
</ItemTemplate>
<FooterTemplate>
<asp:TextBox ID="txtName" runat="server"></asp:TextBox>
<asp:Button ID="Button1" CommandName = "ADD" runat="server"
Text="Add" />
</FooterTemplate>
</asp:TemplateField>
</Columns>

Controllo ascx.cs

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using umbraco.cms;
using umbraco.macroRenderings;
using umbraco.controls;


namespace WebApplication2
{
public partial class WebUserControl1 : System.Web.UI.UserControl
{
private void AddNewRecord(string name)

{

string connectionString = ConfigurationManager.ConnectionStrings["Data Source=soppressata;Initial Catalog=intranet;Integrated Security=True"].ConnectionString;


SqlConnection myConnection = new SqlConnection("Data Source=soppressata;Initial Catalog=xxxxxxxx;Persist Security Info=True;User ID=xxxxxxx;Password=xxxxxxxxxxx");

string query = @"INSERT INTO tabellaok2(data,tipo,oggetto,num,descr,autore,allegato) VALUES(@data @tipo @oggetto @num @descr @autore @allegato)";

SqlCommand myCommand = new SqlCommand(query, myConnection);

string data = "pippo";

myCommand.Parameters.AddWithValue("@data", CheckBox );
myCommand.Parameters.AddWithValue("@tipo", CheckBox);
myCommand.Parameters.AddWithValue("@oggetto", CheckBox);
myCommand.Parameters.AddWithValue("@num", CheckBox);
myCommand.Parameters.AddWithValue("@descr", CheckBox);
myCommand.Parameters.AddWithValue("@autore", CheckBox);
myCommand.Parameters.AddWithValue("@allegato", CheckBox);

myConnection.Open();

myCommand.ExecuteNonQuery();

myConnection.Close();

BindData();

}
}
}

paoval72 Profilo | Senior Member

><uc:WebUserControl id="idcontrollo" runat="server"></pippo:pluto>
Ovviamente il tag deve chiudersi come si è aperto: </uc:WebUserControl>

><asp:GridView ID="GridView1" runat="server" BackColor="White"
>BorderColor="#3366CC" BorderStyle="None" BorderWidth="1px" CellPadding="4"
>AllowSorting="True" AutoGenerateColumns="False" ShowFooter="True"
>OnRowCommand="GridView1_RowCommand">
Riguardo all'errore che ti dà:

Messaggio di errore del compilatore: BC30456: 'GridView1_RowCommand' non è un membro di 'ASP.webusercontrol1_ascx'.

da quanto vedo sopra, hai registrato un evento _RowCommand per il gridview, ma nel code behind che mi hai postato non c'è: è solo perchè non hai postato tutto il codice, oppure proprio l'evento 'GridView1_RowCommand' non è stato creato lato server sull'ascx?


PV

queengab Profilo | Newbie

Suppomngo che non sia stato creato perchè il controllo ascx l'ho trovato su un sito e l'ho preso così com'è.... però natyralmente dall'altro della mia igonranza mnolte cose non le so. Come posso fare?

Gabriele

paoval72 Profilo | Senior Member

>Suppomngo che non sia stato creato perchè il controllo ascx l'ho
>trovato su un sito e l'ho preso così com'è.... però natyralmente
>dall'altro della mia igonranza mnolte cose non le so. Come posso
>fare?
Se l'evento "OnRowCommand="GridView1_RowCommand" non ti serve (almeno per ora), semplicemente eliminalo dal tag:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Prova e dimmi.
PV

queengab Profilo | Newbie

Ti giuro che ti offro una cena... perdonami!!!

Ma adesso mi da questo errore?
Descrizione: Errore durante l'analisi di una risorsa necessaria per soddisfare la richiesta. Rivedere i dettagli relativi all'errore e modificare in modo appropriato il file di origine.

Messaggio di errore del parser: Tag server 'uc:WebUserControl1' sconosciuto.

Errore nel codice sorgente:

Inoltre sull'ascx che ho postato su mi da una serie di errori quando a fare il debug... Mi diche ad esempio System.Web.Ui is a type but i sued like a variable..

Che siginifica come posso fare? Devo dichiarare sullascx che , ad mesepio, il campo data del db è un numero? Se si come? Perchè sui campi di testo ho daot un textbox generico ma su altri non so che dare
Gabriele

paoval72 Profilo | Senior Member

>Ti giuro che ti offro una cena... perdonami!!!
Non c'è problema, finchè posso darti una mano!
>Messaggio di errore del parser: Tag server 'uc:WebUserControl1'

Mi serve capire alcune cose, per questo , se puoi, dovresti postare il codice dell'ascx.cs (questo per gli alert in debug).

Riguardo all'errore del tag, prima risolvi i bachi nell'ascx, poi ricompila tutto il progetto senza errori e prova a istanziare di nuovo il tag: il problema dovrebbe essere solo che non si può inserire un elemento non ancora compilato e quindi "riconosciuto" da Visual Studio.

PV

queengab Profilo | Newbie

Il codice dell'ascx.cs sta sopra in uno dei primo post di questa discussione... Io provo a debuggarlo ma non capisco l'errore...
Ti riepto se hai due minuti e poi provare a mettere su un ascx con quel codice vedrai che ti da una serie di erori che io non so correggere...

Mah

Cmq penso che sia prorpio come dici tu. Giustamente se l'ascx non è compilato bene non può nemmeno riconoscerlo come tale...

Cmq sei davvero troppo gentile
Ti ringrazio

paoval72 Profilo | Senior Member

Qualcosa manca perchè vedo un richiamo a "BindData();" e manca il "page_load".
Se li hai, postali

queengab Profilo | Newbie

eeehhmmmm non li ho... come faccio?

paoval72 Profilo | Senior Member

Ciao. allora secondo me ti manca quache parte. Riguardo all'ultimo errore che ti dà (il system.web.ui usato come tipo), potrebbe essere:
>myCommand.Parameters.AddWithValue("@data", CheckBox );
In quanto la funzione .AddWithValue si aspetta come parametri la stringa col nome del parametro (e ci siamo) e il valore dell'oggetto a cui associarlo. Ad esempio, in questo caso CheckBox è un object, ma non è l'istanza di un oggetto presente nella pagina
>BindData();
Sicuramente,s e non hai trovato altro codice, ti darà un ulteriore errore per questo richiamo di funzione: BindData() non esiste nel codice che hai postato, quindi il sistema ti segnala la sua assenza.
L'unica soluzione è ricrearsi una connessione ad un proprio Db (se ce l'hai), oppure crearsi un source a cui collegare il gridview.
Se però vuoi semplicemente provare se il tuo ascx viene incluso in un aspx, nell'ascx usa un controllo semplice semplice. Ad esempio, nell'html dell'ascx, al posto del GridView, metti una label che abbia come Text ="CIAO, MISSIONE COMPIUTA" (vabbè, il messaggio te lo inventi tu, che è meglio!) e come font-size="60px" (in modo che la dimensione del carattere sia ben visibile). poi, registra e aggancia l'ascx, come già ti avevamo spiegato.
Se poi ti servono controlli più complessi o con source dati da db, vedremo di ricavarli dopo, costruendoli dal nulla.

fammi poi sapere, resto a disposizione.
Ciao,
Paolo

queengab Profilo | Newbie

UP

UP

Allroa fino al semplcie controllo ascx ci sto ... più o meno!

Ora quello di cui ho bisogno, e di cui stavo cercando di documentarmi sul web con tutti i miei liminti, è un controllo che mi permetta di inserire delle righe aggiuntive al mio db che viene poi richiamto direttamente su una pagina aspx. Come?

Praticamente ho scaricato questo controllo gridview per umbraco http://www.blackpoint.dk/umbraco-workbench.aspx?Snippet=/umbraco-workbench/packages/gridviewcontrols.aspx
qui puoi vedere la demo http://jensine.web.surftown.dk/gridviewcollapsabletest.aspx

In pratica sto controlo predne i dati dal db e te li spara direttamente su una pagina.. Puoi pure fare query direttamente dal template di umbraco per mostrare un valore oppure un altro.
Ora mi serve un altro controllo che mi dia la possibilità di inserire delle nuove righe sul db che poi vanno ad aggiungersi a quelle che già mostrate sulla pagina...

Ora i con i cms me la cavo abbastanza... ma onestamente con la programmazione ho molte lacune (conosco dicretamente html e css però mi fermo qui). E siccome me lo ha cihesto il mio capo in tempi ragionevoli mi sto un po' cacando addosso...

Hai qualche controllo gridview già pronto? Io non avrei idea di come farlo da zero ecco perchè stavo cercando di provarne uno su una pagina aspx.

Cmq ancora grazie raramente si trovano persone disponibili come te!
Gabriele

paoval72 Profilo | Senior Member

Ciao, scusa l'interruzione, m a tra il fine settimana e il lavoro...
Allora, se ho capito bene: nella pagina aspx hai questo oggetto umbraco e a te serve inserire nuove righe dall'ascx contenuto nella pagina principale.
Se è così, che info ti serve visualizzare nell'ascx: devi far visualizzare tutti i dati e permettere la selezione o devi solo inserire un dato nuovo senza visualizzare altro?
1) Nel primo caso, puoi usare una gridview, che però non permette l'inserimento diretto di un record. Nell'applicativo che abbiamo sviluppato qui in ufficio abbiamo usato un semplice escamotage (in partenza su un datagrid, ma ora su ung ridview), che per me è pure carino. In poche (???) parole: facciamo il bind dei dati con la griglia. Nel footer della griglia abbiamo un imagebutton, al quale è legato un commandEvent. Al click si scatena l'evento, che recupera dal db il dataset originario, aggiunge una riga con valori di default (di solito vuoti), setta l'editItemIndex del gridview all'ultima riga e poi riassocia il dataset "ricostruito". Sraà poi il bottone di save sulla riga stessa a salvare sul db, a rifare il bind e a mostrarti il nuovo inserimento
ad esempio:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

L'unica altra accortezza è nel caso di più di una pagina nella griglia: in quel caso va gestita la paginazione prima del bind.

2) Nel secondo caso (inserimento solo di una nuova riga), potresti preparare una "maschera" coi campi di default da riempire, magari attivata da un button "Nuovo", che visualizza o nasconde questa scheda (che a sua volta comprende un Button per il "Salva" e magari uno per "Annulla", che svuota tutto).
Spero di esserti stato d'aiuto, almeno per qualche idea o spunto.
Ciao,
PV

queengab Profilo | Newbie

guarda mi sei stato molto d'aiuto!!!! adesso stavol eggendo un paio di libri e poi ho trovato un po di script in giro.

Provo ad inserier un lelemtno per l'insert e l'update all'interno di una gridview però adesso sentendo quello che mi dici potrei anche decidere di mettere un button nel footer...
L'unico problema è che il bottone dovrebbe visualizzarsi solo quando l'utente è registrato. Oppure creare unform a parte solo per chi entra all'interno del cms... Questo è da capire...

Adesso ci rifletto un po'. Magari quando ho fatto tutto ti posto il codice.

Gab

paoval72 Profilo | Senior Member

Ok, grazie. E' sempre utile scambiarsi idee!
A presto,
PV
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