smoitry
Messages postés69Date d'inscriptionvendredi 27 décembre 2002StatutMembreDernière intervention26 juillet 2007
-
10 mai 2006 à 10:53
smoitry
Messages postés69Date d'inscriptionvendredi 27 décembre 2002StatutMembreDernière intervention26 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 !
smoitry
Messages postés69Date d'inscriptionvendredi 27 décembre 2002StatutMembreDernière intervention26 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 ?
smoitry
Messages postés69Date d'inscriptionvendredi 27 décembre 2002StatutMembreDernière intervention26 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 é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 ?
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 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
smoitry
Messages postés69Date d'inscriptionvendredi 27 décembre 2002StatutMembreDernière intervention26 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 !!!
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 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
smoitry
Messages postés69Date d'inscriptionvendredi 27 décembre 2002StatutMembreDernière intervention26 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 :
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.
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 !
smoitry
Messages postés69Date d'inscriptionvendredi 27 décembre 2002StatutMembreDernière intervention26 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 !!!)