OVH Cloud OVH Cloud

DataList avec EditTemplate et RadioButtonList

2 réponses
Avatar
Delf
Bonjour.

Je bloque sur un problème. Etonnant me direz-vous ;)

J'ai un DataList qui utilise l'attribut EditTemplate afin de donner la
possibilité à l'utilisateur de modifier un élément affiché via le DataList.

Prenons un exemple : une page doit afficher N "Produits". J'utilise donc
un DataList pour les afficher.

Pour chaque produit, j'affiche si ce dernier est présent en stock ou non
par "True" ou "False" dans un Label. Pour chaque Produit, un LinkButton
"Modify".

Quand on clique dessus, on utilise l'EditTemplate afin d'afficher un
controle (ici à l'occurrence un RadioButtonList) à la place du Label ;
là, j'affiche un RadioButtonList avec comme boutons radio :

In stock ? O Yes O No.

Jusque là, tout fonctionne.

Mais je ne sais pas comment initialiser le bon bouton radio quand on
clique sur ce fichu lien "Modify"...

Je voulais faire qq chose du genre :

<asp:RadioButtonList
ID="rbProduite"
runat="server"
RepeatDirection="Horizontal">

<asp:ListItem
Selected='<%# ((string)DataBinder.Eval(Container.DataItem,
"InStock")).ToUpper() == "TRUE" %>'
Value="Yes" Text="Yes">
</asp:ListItem>
<asp:ListItem
Selected='<%# ((string)DataBinder.Eval(Container.DataItem,
"InStock")).ToUpper() == "TRUE" %>'
Value="No" Text="No">
</asp:ListItem>

...

Bien sur, ça ne marche pas...

Parser Error Message: Databinding expressions are only supported on
controls. System.Web.UI.WebControls.ListItem is not a control.

Ah bon...

Actuellement, je passe par un CheckBox pour tout ce qui est True/False
mais je bloque dès qu'il s'agit d'un choix parmi plusieurs
(DropDownList, etc)... Comment initialiser ce genre de contrôles ? Genre
je veux mettre en place ce RadioButtonList :

InStock ? O Perhaps O Yes O No O I don't know 'cause the stock is a mess

If faut bien que je "coche/sélectionne" le bon bouton radio...

Via la méthode Edit_Command liée au contrôle sur l'action Modify ?
Voici cette méthode :

protected void Edit_Command(Object sender, DataListCommandEventArgs e)
{
dlProduit.EditItemIndex = e.Item.ItemIndex;

dlProduit.DataSource = m_DataView;
}

Mais à ce niveau là, le contrôle rbType n'existe pas et je ne le trouve
pas non plus avec un .FindControl(), ce qui me parait logique vu qu'il
n'existe pas... mais quand on désespère, on tente tout...

Est-il possible de l'initialiser dans le code C# ? Est-ce possible
uniquement dans la page ASP.NET ? En tout cas, au niveau du contrôle
dans la page, je ne vois pas comment faire... Quel bordel ce contrôle :]

Je vois pas pas comment faire...

En espérant que qq'un puisse m'aider.
Merci anticipé.

--
Delf

2 réponses

Avatar
Delf
Delf wrote:

> [...]

Personne ne sait comment faire ?

--
Delf
Avatar
Aurélien [MS]
Bonjour Delf,

Vu que ta question ne rencontre pas un grand succès, je me suis lancé pour
faire une page d'exemple.
.
En gros :
- Tu mets ton RadioButtonList dans le EditItemTemplate (ça je crois que tu
sais déjà faire)
- Ensuite quand tu passes en mode édition, ce qu'il faut faire, c'est
récupérer l'instance de ton contrôle RadioButtonList dans l'événement
ItemDatabound du contrôle DataList. Cet événement est levé une fois pour
chaque élément qui lui est lié. (dans ton cas, tu as N produits à afficher,
donc l'événement va être levé N fois)
- Dans ItemDatabound, tu vas donc ensuite vérifier si l'élément de ta
DataList qui est en train de se lier aux données est en cours de
modification, et si c'est le cas, tu peux alors récupérer l'instance de ton
contrôle RadioButtonList et lui faire ce que tu veux.

Exemple qui utilise la table Customers de la base exemple Northwind, et qui
affiche le CompanyName, puis le Country.
En mode modification, le Country est dans un RadioButtonList.

Au niveau de la page ASPX, voici le contrôle DataList (rien de bien
compliqué):
===================================================== <asp:DataList idÚtaList1 runat="server" DataSource="<%# dataSet11 %>"
DataMember="Customers" DataKeyField="CustomerID">
<ItemTemplate>
<hr>
<asp:LinkButton id="LinkButton1" runat="server"
commandname="Edit">Modifier</asp:LinkButton><br>
<%# DataBinder.Eval(Container.DataItem,"CompanyName")%>
<br>
<%# DataBinder.Eval(Container.DataItem,"Country")%>
</ItemTemplate>
<EditItemTemplate>
<hr>
<%# DataBinder.Eval(Container.DataItem,"CompanyName")%>
<br>
<asp:RadioButtonList ID="rbl1" runat="server"
RepeatDirection="Horizontal">
<asp:ListItem Text="France"></asp:ListItem>
<asp:ListItem Text="Germany"></asp:ListItem>
<asp:ListItem Text="Mexico"></asp:ListItem>
<asp:ListItem Text="UK"></asp:ListItem>
<asp:ListItem Text="Sweden"></asp:ListItem>
<asp:ListItem Text="Argentina"></asp:ListItem>
<asp:ListItem Text="Brazil"></asp:ListItem>
<asp:ListItem Text="Italy"></asp:ListItem>
</asp:RadioButtonList>
</EditItemTemplate>
</asp:DataList>

Dans le code-behind :
==============
private void Page_Load(object sender, System.EventArgs e)
{
sqlDataAdapter1.Fill(dataSet11);
DataList1.DataBind();
}

private void DataList1_EditCommand(object source,
System.Web.UI.WebControls.DataListCommandEventArgs e)
{
DataList1.EditItemIndex = e.Item.ItemIndex;
DataList1.DataBind();
}

private void DataList1_ItemDataBound(object sender,
System.Web.UI.WebControls.DataListItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.EditItem)
{
RadioButtonList rbl1;
rbl1 = (RadioButtonList)e.Item.FindControl("rbl1");
foreach (ListItem i in rbl1.Items)
{
if (i.Text == (string)DataBinder.Eval(e.Item.DataItem,
"Country"))
i.Selected = true;
}
}
}


Voilà, en espérant que ce soit ce que tu attendais.
Sinon, n'hésite pas à me le dire !

--
Aurélien Norie
Microsoft France
--------------------
Merci de bien vouloir répondre à ce message dans le newsgroup où il a été
posté. Je le consulte régulièrement.


"Delf" a écrit dans le message de news:
4342aa42$0$20860$
Delf wrote:

> [...]

Personne ne sait comment faire ?

--
Delf