[ASP2] Problème WebControl et affichage dans le Designer

smoitry Messages postés 69 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 26 juillet 2007 - 4 mai 2006 à 08:54
thebenjiman Messages postés 1 Date d'inscription samedi 17 juin 2006 Statut Membre Dernière intervention 15 janvier 2008 - 15 janv. 2008 à 15:45
Bonjour,

J'ai un problème que je n'arrive pas à résoudre depuis 3 jours : j'ai créé un WebControl dont le but est de m'afficher un cadre dans la page contenant une liste de liens. Je l'ai appelé LinkBox, et je le peuple d'une liste de LinkBoxItem, contenant chacun un titre, une url, un target (frame destination) et une description. Afin de pouvoir peupler la liste dans le code source de la page, je souhaite pouvoir include des objets LinkBoxItem entre les balises de l'objet LinkBox, comme on peuplerait une ListBox ...

Voici le code source du contrôle LinkBox :


using System;

using System.Collections;

using System.Collections.Generic;

using System.ComponentModel;

using System.Text;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

namespace WebControlLibrary1
{
[
DefaultProperty(
"Text")]
[
ToolboxData(
"<{0}:LinkBox runat=server></{0}:LinkBox>")]
[
ControlBuilder(
typeof(
LinkBoxControlBuilder))]
[
ParseChildren(
true,
"Items")]
[
PersistChildren(
true)]

public
class
LinkBox :
WebControl
{

//private List<LinkBoxItem> _items;
private
ArrayList _items2 =
new
ArrayList();

public LinkBox() :
base()
{

//_items = new List<LinkBoxItem>();
_items2 =
new
ArrayList();
ViewState[
"Items"] = _items2;
}

//[Bindable(true)]
[
Category(
"Appearance")]
[
Localizable(
false)]
[
PersistenceMode(
PersistenceMode.InnerDefaultProperty)]

public
ArrayList Items
{

get {
return (_items2); }

set { _items2 =
value; }
}

[Bindable(
true)]
[
Category(
"Appearance")]
[
DefaultValue(
"")]
[
Localizable(
true)]

public
string Text
{

get
{

String s = (
String)ViewState[
"Text"];

return ((s ==
null) ?
String.Empty : s);
}

set { ViewState[
"Text"] =
value; }
}

[
Bindable(
true)]
[
Category(
"Appearance")]
[
DefaultValue(
"")]
[
Localizable(
true)]

public
string Title
{

get
{

String s = (
String)ViewState[
"Title"];

return ((s ==
null) ?
String.Empty : s);
}

set { ViewState[
"Title"] =
value; }
}

protected
override
void AddParsedSubObject(
object obj)
{

if (obj
is
LinkBoxItem)
Items.Add((
LinkBoxItem)obj);
}

protected
override
void RenderContents(
HtmlTextWriter output)
{
ViewState[
"items"] = _items2;
output.Write(
"
");
output.Write(
"
");
output.Write(
"");
output.Write(
"
");
output.Write(
" " + Title +
"
");
output.Write(
"
");
output.Write(
"
");
output.Write(
" " + Text +
"
");
output.Write(
"");
output.Write(
"
");

foreach(
LinkBoxItem itm
in Items)
{
output.Write(
"" + itm.Title +
"");

if (itm.Desc.Length > 0)
output.Write(
", " + itm.Desc);
output.Write(
"
");
}
output.Write(
"

");
output.Write(
"
");
}
}
}


<HR>

Voici le code source de LinkBoxItem :


using System;

using System.Collections.Generic;

using System.Text;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

namespace WebControlLibrary1
{

public
class
LinkBoxItem
{

private
string _title;

private
string _url;

private
string _target;

private
string _desc;



public LinkBoxItem() :
base()
{
_title =
"";
_url =
"";
_target =
"";
_desc =
"";
}

public
override
string ToString()
{

return (_title);
}

#region Properties

public
string Desc
{

get {
return (_desc); }

set { _desc =
value; }
}

public
string Target
{

get {
return (_target); }

set { _target =
value; }
}

public
string Title
{

get {
return (_title); }

set { _title =
value; }
}

public
string Url
{

get {
return (_url); }

set { _url =
value; }
}

#endregion
}
}


<HR>

Et enfin le code source du LinkBoxControlBuilder :


using System;

using System.Collections.Generic;

using System.Text;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

namespace WebControlLibrary1
{

public
class
LinkBoxControlBuilder :
ControlBuilder
{

public
override
Type GetChildControlType(
string tagName, System.Collections.
IDictionary attribs)
{

if (tagName.ToLower() ==
"linkboxitem")

return
typeof(
LinkBoxItem);

return
null;
}
}
}


<HR>

Exemple d'utilisation :



<SMWeb:LinkBox
ID="LinkBox1"
runat="server"
Text="Ceci est un petit texte descriptif de la boite ..." Title="Titre de la boite">
<SMWeb:LinkBoxItem
Target="_blank"
Desc=""
Title="Site 1"
Url="http://www.site1.com/"></SMWeb:LinkBoxItem>
<SMWeb:LinkBoxItem
Target="_blank"
Desc=""
Title="Site 2"
Url="http://www.site2.com/"></SMWeb:LinkBoxItem>
<SMWeb:LinkBoxItem
Target="_blank"
Desc="le meilleur !"
Title="Site 3" Url="http://www.site3.com/"></SMWeb:LinkBoxItem>
</SMWeb:LinkBox>

A l'exécution, cela donne l'affichage suivant :

Ce qui est exactement le comportement souhaité (ok la feuille de style n'est pas appliquée pour le moment mais là n'est pas le problème ...)

Mon problème, c'est que dans le designer, j'obtiens ça :

Et ça c'est pas normal ...

Avant, je mettais "ParseChildren(false)" au niveau du WebControl, et du coup il ne lisait pas les tags des éléments LinkBoxItem, par contre j'arrivais à peupler la propriété Items via la fenêtre propriétés de Visual Studio, cependant, il ne rajoutait pas les tags dans le code source de la page, ce qui fait qu'une fois rechargé la fenêtre, la liste était vide ...

Vous constaterez que j'utilisais au début une List<LinkBoxItem> que j'ai temporairement remplacé par une ArrayList pensant que c'était le seul type que pouvait utiliser ASP.NET via l'attribut ParseChildren ...

Qu'est ce que j'ai fait faux ? Juste un oubli quelque part ou est-ce que je n'ai rien compris à la méthode en ASP.NET ?

Pour info j'ai fait un paquet d'ASP classique et j'ai sauté l'étape ASP.NET 1.x ...

Merci pour vos réponses !

Stéphane.

6 réponses

smoitry Messages postés 69 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 26 juillet 2007
4 mai 2006 à 09:46
Mince, je croyais que les images seraient uploadées vers le site ... Je viens de voir qu'il a mis un lien vers [file:///etc file:///etc]... donc bon comme j'ai pas de possibilité de les mettre sur le net depuis le bureau, je les décris :

Première image montre qu'à l'exécution, tout est ok : le titre, en dessous la description, suivie d'une liste de liens.

Deuxième image :
Une infâme boite grise ala Visual Studio avec écrit dedans :
Erreur lors de la création du contrôle - LinkBox1
Impossible de définir 'SMWeb:LinkBox' pour la propriété 'Items'.

Encore toutes mes excuses ...
0
smoitry Messages postés 69 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 26 juillet 2007
6 mai 2006 à 12:23
Personne n'a d'idée ?
0
smoitry Messages postés 69 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 26 juillet 2007
10 mai 2006 à 10:35
Et ben ? Personne n'a jamais voulu coder un WebControl avec une collection d'items personnalisés ?
0
gummel Messages postés 1 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 18 août 2006
18 août 2006 à 11:46
slt ca fait plusieurs moi que je cherche moi aussi à faire
ce genre de chose la, bon je suis pas dutout développeur donc je suis mal barré,
mais je cherche sur le net si il existe des box ou des codes qui existe déjà.


donc t'a projet m'intéresse beaucoup, je voulais savoir si tu avais réussi, et
si je pouvais voir ton site, et voir a koi cela ressemblais!!


Si tu veu me contacté gummel49@gmail.com


merci encore


et bon courage pour ton projet
0

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

Posez votre question
Bubuss Messages postés 147 Date d'inscription samedi 7 juin 2003 Statut Membre Dernière intervention 8 décembre 2007
29 août 2006 à 09:28
me too
0
thebenjiman Messages postés 1 Date d'inscription samedi 17 juin 2006 Statut Membre Dernière intervention 15 janvier 2008
15 janv. 2008 à 15:45
Ce site m'a beaucoup aidé;
Esperant qu'ils vous aide aussi

http://www.dotnetjohn.com/articles.aspx?articleid=179
0
Rejoignez-nous