[ASP2] Tuto pour un WebControl ?

Résolu
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:53
smoitry Messages postés 69 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 26 juillet 2007 - 29 mai 2006 à 17:03
Bonjour !

Quelqu'un connait-il un bon tuto sur la création de WebControls avec possibilité de rajouter des Items sous forme de tags enfants (comme on peuple un asp:ListBox avec des asp:ListItem) mais dont les Items seraient d'une classe personnalisée (pas des simples asp:ListItem mais par exemple perso:ItemPerso) et qui fonctionne correctement dans le Designer ?

Je sèche et mon message précédent concernant mon problème n'a trouvé aucune réponse !

Merci d'avance !!!

A+

Stéphane

11 réponses

jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
10 mai 2006 à 12:03
3
smoitry Messages postés 69 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 26 juillet 2007
12 mai 2006 à 13:04
Salut Jesusonline !

Merci pour tes réponses, j'ai trouvé exactement ce dont j'avais besoin sur le lien suivant :


http://www.microsoft.com/france/msdn/aspnet/ControleDonnees.mspx

Lien que j'ai trouvé sur la deuxième page que tu m'as indiqué ... C'est parfait, je te remercie pour ton aide !

A+

Stéphane
3
smoitry Messages postés 69 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 26 juillet 2007
14 mai 2006 à 14:05
Salut Jesusonline !


Petite question : tout marche, même plus que je ne pensais, j'ai fait le DataBinding comme dans le tutoriel, c'es génial. Mais (et là je parle de l'exemple du tuto que j'ai suivi à la lettre), lorsque je remplis les propriétés qui renseignent les noms des champs dans lesquels puiser les infos, à chaque fois que je passe dans le designer, il m'ajoute automatiquement 3 items avec le champ Text positionné à "abc", comment éviter que cela se produise ?


Merci ! A+


Stéphane
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
14 mai 2006 à 16:07
Je ne comprend pas trop le problème,

quelles propriété modifies tu ? peux tu me montrer le markup qui en resulte?


<HR>
Cyril - MVS - MCP
0

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

Posez votre question
smoitry Messages postés 69 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 26 juillet 2007
17 mai 2006 à 23:09
Salut, désolé pour la réponse tardive ! Hier soir le site était en maintenance (évolutive apparemment ;-)) (bon et puis là je pensais que ma réponse était passée mais visiblement pas ..., j'espère que là ça passe)
Alors voilà, j'ai fait le tuto, donc un contrôle ButtonList, qui dans une collection Items contient des définitions de boutons, et les instancie au rendu. Dès que je remplis les propriétés DataCommandField et DataTextField (après avoir renseigné au préalable DataSourceID), le designer ajoute automatiquement des éléments "abc" à <?xml:namespace prefix st1 ns "urn:schemas-microsoft-com:office:smarttags" /?><st1:personname w:st="on" productid="la collection Items">la collection Items</st1:personname>, sans que je ne lui demande rien ... voici le markup en mode "source" :<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>



<
SMWeb
:
ButtonList

ID
="ButtonList1"
runat
="server"
DataCommandField
="Commande"
DataSourceID
="SqlDataSource1"
DataTextField
="Titre">
<
Items
>
<
SMWeb
:
ButtonItem
CommandName
="New"
Text
="Ceci est un bouton"
/>
<
SMWeb
:
ButtonItem
CommandName
="Edit"
Text
="Ca c'est pour &#233;diter"
/>
<
SMWeb
:
ButtonItem
CommandName
="abc"
Text
="abc"
/>
<
SMWeb
:
ButtonItem
CommandName
="abc"
Text
="abc"
/>
<
SMWeb
:
ButtonItem
CommandName
="abc"
Text
="abc"
/>
<
SMWeb
:
ButtonItem
CommandName
="abc"
Text
="abc"
/>
<
SMWeb
:
ButtonItem
CommandName
="abc"
Text
="abc"
/>
<
SMWeb
:
ButtonItem
CommandName
="abc"
Text
="abc"
/>
<
SMWeb
:
ButtonItem
CommandName
="abc"
Text
="abc"
/>
<
SMWeb
:
ButtonItem
CommandName
="abc"
Text
="abc"
/>
<
SMWeb
:
ButtonItem
CommandName
="abc"
Text
="abc"
/>
<
SMWeb
:
ButtonItem
CommandName
="abc"
Text
="abc"
/>
</
Items
>
</
SMWeb
:
ButtonList
>

Les deux premiers Items, je les ai remplis à a main, les autres contenant "abc" sont ajoutés tous seuls ... Comment faire pour éviter cela ?

Si tu as une soluce, je suis preneur !!!

Merci d'avance !

Stéphane
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
17 mai 2006 à 23:39
euh *-)

c'est ouf ca :p

abc ca vient de qqpart de ton code ?

ta propriété items c'est quoi ? une list<truc> ou alors un tableau de truc (truc[]), si c'est un tableau de truc passe plutot par une list<truc> sinon j'en ai aucune idée :s

<hr />Cyril - MVS - MCP
0
smoitry Messages postés 69 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 26 juillet 2007
19 mai 2006 à 13:59
Alors, Items c'est de type LinkBoxItemCollection
Et LinkBoxItemCollection ça hérite :

public
class
LinkBoxItemCollection :
Collection<
LinkBoxItem>
{

public
void LoadViewState(
object state)
{

if (state !=
null)
{

Pair p = (
Pair)state;
Clear();

Pair One = (
Pair)p.First;

Pair Two = (
Pair)p.Second;

string[] rgTitle = (
string[])One.First;

string[] rgUrl = (
string[])One.Second;

string[] rgTarget = (
string[])Two.First;

string[] rgDesc = (
string[])Two.Second;

for (
int i = 0; i < rgTitle.Length; i++)
{
Add(
new
LinkBoxItem(rgTitle[i], rgUrl[i], rgTarget[i], rgDesc[i]));
}
}
}

public
object SaveViewState()
{

int numOfItems = Count;

object[] rgTitle =
new
string[numOfItems];

object[] rgUrl =
new
string[numOfItems];

object[] rgTarget =
new
string[numOfItems];

object[] rgDesc =
new
string[numOfItems];

for (
int i = 0; i < numOfItems; i++)
{
rgTitle[i] =
this[i].Title;
rgUrl[i] =
this[i].Url;
rgTarget[i] =
this[i].Target;
rgDesc[i] =
this[i].Desc;
}

Pair One =
new
Pair(rgTitle, rgUrl);

Pair Two =
new
Pair(rgTarget, rgDesc);

return
new
Pair(One, Two);
}
}

Et sinon, abc n'est présent nulle part dans mon code !!! En fait, ça ressemble plutôt à un automatisme du designer qui ajouterait des objets automatiquement pour prévisualiser le contrôle alors que la propriété Items serait vide ... Le problème, c'est qu'il le fait systématiquement !!!

Merci pour ton aide !
A+

Stéphane
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
21 mai 2006 à 15:11
Je comprend pas pourquoi tu as loadviewstate et saveViewstate dans ta collection :-/ dans le code de ton userControl comment déclares tu ta propriété ? il faut absolument la mettre en readonly si je me souviens bien :

private _items as new List(of LinkBoxItem)
public default readonly property items as List( ofLinkBoxItem)
get
return _items
end get
end property

et ca devrait peut etre j'espere mieux fonctionner :p

<hr />Cyril - MVS - MCP
0
smoitry Messages postés 69 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 26 juillet 2007
29 mai 2006 à 14:55
Salut,

Je rentre de congés ! Merci pour ta réponse ... En fait le loadviewstate et le saveviewstate c'est selon le tuto que tu m'avais filé parce que c'est plus rapide de sérialiser et désérialiser les items en faisant des paires de tableaux qu'en laissant le sérialiseur par défaut du framework ...

Sinon pour la propriété, elle est déclarée comme ça :

private
ButtonItemCollection _items;

[
DesignerSerializationVisibility(
DesignerSerializationVisibility.Content)]
[
PersistenceMode(
PersistenceMode.InnerProperty)]

public
virtual
ButtonItemCollection Items
{
   get
   {

      if (_items ==
null)
      {
         _items =
new
ButtonItemCollection();

         if (
base.IsTrackingViewState)
base.TrackViewState();
      }

      return _items;
   }
}

Comme tu vois, je suis en CSharp, je pense que le Readonly de VB correspond à ne pas implémenter le "set" de la propriété ...

Ouh lààà je vois aussi que dans un post précédent je t'ai mis le source d'une classe LinkBoxItemCollection, j'ai inversé j'aurais dû te mettre celle de ButonItemCollection. Mais de toute façon le problème est le même, les deux classes ont le même contenu à une différence près : ButonItem n'a que deux propriétés string, et donc ne fait qu'une seule paire dans le loadviewstate et saveviewstate.

En fait, si tu reprends le markup suivant :

<SMWeb:ButtonList
ID="ButtonList1"
runat="server"
DataCommandField="Commande"
DataSourceID="SqlDataSource1"
DataTextField="Titre">
   <Items>
      <SMWeb:ButtonItem
CommandName="New"
Text="Ceci est un bouton"
/>
      <SMWeb:ButtonItem
CommandName="Edit"
Text="Ca c'est pour &#233;diter"
/>
      <SMWeb:ButtonItem
CommandName="abc"
Text="abc"
/>
      <SMWeb:ButtonItem
CommandName="abc"
Text="abc"
/>
      <SMWeb:ButtonItem
CommandName="abc"
Text="abc"
/>
      <SMWeb:ButtonItem
CommandName="abc"
Text="abc"
/>
      <SMWeb:ButtonItem
CommandName="abc"
Text="abc"
/>
      <SMWeb:ButtonItem
CommandName="abc"
Text="abc"
/>
      <SMWeb:ButtonItem
CommandName="abc"
Text="abc"
/>
      <SMWeb:ButtonItem
CommandName="abc"
Text="abc"
/>
      <SMWeb:ButtonItem
CommandName="abc"
Text="abc"
/>
      <SMWeb:ButtonItem
CommandName="abc"
Text="abc"
/>
      <SMWeb:ButtonItem
CommandName="abc"
Text="abc"
/>
      <SMWeb:ButtonItem
CommandName="abc"
Text="abc"
/>
      <SMWeb:ButtonItem
CommandName="abc"
Text="abc"
/>
      <SMWeb:ButtonItem
CommandName="abc"
Text="abc"
/>
      <SMWeb:ButtonItem
CommandName="abc"
Text="abc"
/>
   </Items>
</SMWeb:ButtonList>

qui est donc généré, en fait, il n'y a que les deux premiers objets ButtonItem que j'ai créés manuellement dans le designer en éditant la propriété Items. Ensuite, je définis un DataSourceID, puis le DataCommandField et le DataTextField pour faire la laison de données, et immédiatement le designer ajoute tous ces objets "abc" sans que je ne lui dise rien. Et du coup les objets se sérialisent dans le markup. Ensuite, quand je lance le projet pour afficher la page, l'objet ButtonList contient tous les éléments ButtonItem du markup, suivis de ceux lus dans la table de base de données qui est liée par le DataSourceID...

Donc moi ce qui m'arrangerait, c'est qu'au lieu de ça, le designer lise directement la base liée pour m'afficher les bons objets, mais à la rigueur s'il ne sait pas le faire ce n'est pas grave, je peux me contenter des objets abc, mais il ne faut pas qu'il génère le markup !

As-tu une idée ?

Merci ! Stéph.
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
29 mai 2006 à 16:55
Je donne ma langue au chat :-(

Je ne vois vraiment pas pourquoi ce *^$ù*ù de designer nous génére tout ca !

Ce que tu peux faire c'est débugger ton control at design-time ... c'est un peu lourd mais ca pourrait t'aider. Regarde ici http://imar.spaanjaars.com/QuickDocId.aspx?quickdoc=306 

bon courage

<hr />Cyril - MVS - MCP
0
smoitry Messages postés 69 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 26 juillet 2007
29 mai 2006 à 17:03
Merci pour le lien ! J'ai contacté Frédéric Mélantois à ce sujet, il m'a dit qu'il tenterait aussi de m'aider, s'il n'a rien qui lui vient je tenterai ce debug at design-time ... Ou alors j'accepte que c'est un bug de Visual Studio et je supprimerai manuellement le markup généré et ne repasserai plus en mode "Design" sur les pages concernées pour ne pas qu'elles se polluent ...

Tu me diras c'est une solution, pas pratique mais c'en est une ... Le problème c'est que j'ai plutôt l'impression qu'il y a quelque chose dans mon code qui n'est pas juste, et mettre un site en prod avec un contrôle buggé, ce serait pas la première fois, mais le faire en sachant à l'avance qu'il est buggé, ça me laisse un goût amer :-)

En tous cas merci de m'avoir aidé !!!

T'inquiète, je reviendrai certainement dans pas longtemps sur ce forum pour poser une autre question (qui n'a pas de rapport avec ce problème je te rassure), sur un truc à la con sur lequel je planche depuis jeudi ... (oui je ne choisis pas la solution de facilité au bout de 5 minutes où ça ne marche pas !!!)

A bientôt !

Stéph.
0
Rejoignez-nous