ASP.NET et C# - Paramétrage contrôl Label dans un ItemTemplate de DataList

zouzou0607 Messages postés 2 Date d'inscription vendredi 25 janvier 2008 Statut Membre Dernière intervention 29 janvier 2008 - 28 janv. 2008 à 10:43
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 - 4 juin 2008 à 19:33
Bonjour,

je cherche à accéder en code behind à un controle Label dans l'ItemTemplate d'un DataList afin d'y afficher un texte dynamiquement s'il y a lieu.

Voici mon code :

<form id="form1" runat="server">


"DataList1" runat="server">

"Label1" runat="server" Text="Test">



</form>

et mon code behind :

Label lb =
new
Label();lb = (

Label)FindControl(
"Label1");lb.Text =

"coucou !";

la génération passe mais lorsque j'affiche ma page dans mon navigateur j'obtiens :
La référence d'objet n'est pas définie à une instance d'un objet

Quelqu'un aurait-il une idée ?

Zouzou

10 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
28 janv. 2008 à 21:41
Salut

Il faut que tu modifie sur l'événement

 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
et la row courante dans le e.Row

Aprés a toi de t'amuser a modifier les cellules.

Voila
0
zouzou0607 Messages postés 2 Date d'inscription vendredi 25 janvier 2008 Statut Membre Dernière intervention 29 janvier 2008
29 janv. 2008 à 09:46
D'accord mais je n'ai pas de GridView dans ma page, j'ai un DataList. Donc j'ai essayé comme çà en behind :

protected
void DataList1_ItemDataBound(
object sender,
DataListItemEventArgs e){

Label lb =
new
Label();lb = (

Label)FindControl(
"Label1");lb.Text =

"coucou !";}

et voila ma page :

<form
id="form1"
runat="server">

<div>

<asp:DataList
ID="DataList1"
runat="server"
OnItemDataBound="DataList1_ItemDataBound">

<ItemTemplate>

<asp:Label
ID="Label1"
runat="server"
Text="test"></asp:Label>

</ItemTemplate>

</asp:DataList></div>

</form>Soit dit-en passant je suis novice en ASP et encore plus en C#.

Merci d'avance !!

Zouzou
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
29 janv. 2008 à 19:17
Voila de quoi t'aider

    protected void DataList1_ItemDataBound(object sender, DataListItemEventArgs e)
    {
        Label lb = new Label();
        lb.Text = (e.Item.DataItem as DataRowView)["ProductName"].ToString();      
        e.Item.Controls.Add(lb);
    }

Si tu as une colonne dans ta datasource.

Sinon tu peux parcourir la collection des controles.
0
pifou25 Messages postés 144 Date d'inscription lundi 13 octobre 2003 Statut Membre Dernière intervention 21 décembre 2014
3 juin 2008 à 12:01
Bonjour,

j'ai trouvé ce post très intéressant ça m'a bien fait avancer... mais pas tout à fait! j'ai voulu utiliser un hyperlink à la place du label ci dessus et j'ai l'erreur sur la dernière ligne: e.Item.Controls.Add(hlp);

L'exception System.ArgumentException n'a pas été gérée par le code utilisateur
  Message="'TableRow' ne peut pas avoir d'enfant du type 'HyperLink'."
  Source="System.Web"

Comment puis-je ajouter un hyperlink dans ma cellule alors?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ghano81 Messages postés 41 Date d'inscription samedi 21 juillet 2007 Statut Membre Dernière intervention 29 janvier 2013
3 juin 2008 à 12:56
pifou25 si tu utilise une table    TAble ou une table html
voila comment ajouter un hyperlink  dans ta cellule
Table

Table1 =
new
Table();

TableRow

tempRow = newTableRow();

HyperLink lien =
new
HyperLink();
TableCell

tempCellc =
new
TableCell();

tempCellc.Controls.Add(lien);tempRow.Cells.Add(tempCellc);

Table1.Rows.Add(tempRow);

pour chercher ton controle

foreach

(
TableRow row
in Table1.Rows){

HyperLink
chec = (HyperLink)row.FindControl(ID);

if (chec.Checked && chec !=
null){

string gh = row.Cells[0].Text;
Response.Write(gh);

}
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
3 juin 2008 à 14:03
Salut,

Remettons un peu d'ordre dans le post pour ne pas induire en erreur et melanger les réponses.

ghano81 : Ta méthode est une méthode qui est a éviter au maximum en dotnet.
Tu ne separes pas la présentation des traitements.
Tu perds de nombreux avantages du datagrid (modele objet et ...)
Tu perds la personnalisation plus fine permise par ce composant, malgré qu'il est préférable d'utiliser le listview du framework 3.5 (CSS friendly et customisation encore plus fine)

Le datagrid te generas un tableau html au final, et tu n'a en général pas besoin de modifier le code source pour modifier l'aparence.

pifou25 : TableRow ne peut pas contenir des hyperlink c'est un peu normal.
en HTML il tr contient des cellule "<td>" et non des link ""

Il faut que tu descendes au niveau du TableCell pour inserer ton controle hyperlink.

Sinon pourquoi ne pas utiliser un itemtemplate pour faire ton lien,
il faut au maximum ne pas inserer de controle pendant la phase de rendu.

Question de maintenance.

Bon coding a vous tous.
0
ghano81 Messages postés 41 Date d'inscription samedi 21 juillet 2007 Statut Membre Dernière intervention 29 janvier 2013
3 juin 2008 à 14:27
 nhervagault : oui t'as raison c'est pas evident d'utiliser une table html et gerer bien les controles enfants surtout lorsque sont crées dynamiquement (enfin c'est à eviter )
mais moi jé repondu selon  son besoin
 
à mon avis utiliser un repeater mieu qu'un datagrid ou gridview 

bonne chance et goodluck
 
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
3 juin 2008 à 14:56
Ok,
Mais je pense que la raison est celle indiqué dans mon post que tu n'avais pas du voir gestion des tablerow et tablecell.

Il fallait recadrer un peu le post pour ne pas mélanger les 2 techniques de creation de tableau.

Je serais plus sur le listview que sur le repeater, il est possible de faire
les 3 types de controle (repeater, datalist et gridview ) avec ce controle.

Bon coding
0
pifou25 Messages postés 144 Date d'inscription lundi 13 octobre 2003 Statut Membre Dernière intervention 21 décembre 2014
4 juin 2008 à 16:31
Merci pour vos réponses et explications

nhervagault > je n'ai pas  le choix je pense, d'utiliser cette méthode: actuellement il y a bien un itemTemplate avec un type de lien + label, mais dans mon cas je me retrouve avec une colonne qui contient un lien différent selon le type de la ligne. Quoi qu'il en soit, chaque ligne contient un lien et je pourrais insérer un lien "par défaut" du coté aspx puis définir dans le code-behind la propriété "navigateURL" du lien vers l'un ou l'autre cible. C'est mieux ainsi?
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
4 juin 2008 à 19:33
Tu peux binder la navigateurl de ton lien, il y a pas de probleme.
Comme tu bind un attribut text d'uen textbox, moi je le fais aussi sur des checkbox, le checked,
une couleur d'un autre controle, ... les possibilités sont infinis.

Sinon voici une autre methode
http://geekswithblogs.net/azamsharp/archive/2005/12/22/63951.aspx
String.format dois aussi fonctionner

Tu as dans les gridview une colonne de type link
hyperlinkfield

Tu peux binder n'importequel attribut, comme en WPF, (sauf que c'est encore plus puissant)
0
Rejoignez-nous