InvalidOperationException() Eval() XPath() Bind()
Bonjour,
Aprés avoir modifié le EditItemTemplate d'un DetailsView en remplaçant un label par un contrôle de type DropDown, j'obtiens l'exception
Citation:
InvalidOperationException : Les méthodes de liaison de données telles que Eval(), XPath() et Bind() peuvent uniquement être utilisées dans le contexte d'un contrôle lié aux données.
Cette erreur survient au moment du DeatailsView.Databind (lorsque je veux recharger le contenu de ma DropDown aprés insertion, modification ou suppression d'un des éléments contenus dans ma table Sql).
Je fais pourtant la même opération dans une page précédente (ajout, modification et suppression de catégories et affichage de toutes les catégories dans une DropDownlist) et ça fonctionne bien. La seule différence est que je ne l'utilise pas dans un DetailsView sur cette page.
Voici le code ASP :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
<asp:SqlDataSource ID="dsProduit" runat="server"
ConnectionString="<%$ ConnectionStrings:csSigneEtSens %>"
DeleteCommand="DELETE FROM [Produit] WHERE [Prod_Id] = @Prod_Id"
SelectCommand="SELECT * FROM [Produit] INNER JOIN [Categorie] ON Produit.Cat_Id = Categorie.Cat_Id WHERE ([Prod_Id] = @Prod_Id)"
UpdateCommand="UPDATE [Produit] SET [Prod_Nom] = @Prod_Nom, [Prod_Texte] = @Prod_Texte, [Prod_Prix] = @Prod_Prix, [Prod_Image] = @Prod_Image, [Cat_Id] = @Cat_Id WHERE [Prod_Id] = @Prod_Id">
<SelectParameters>
<asp:QueryStringParameter Name="Prod_Id" QueryStringField="ID" Type="Int32" />
</SelectParameters>
<DeleteParameters>
<asp:Parameter Name="Prod_Id" Type="Int32" />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="Prod_Nom" Type="String" />
<asp:Parameter Name="Prod_Texte" Type="String" />
<asp:Parameter Name="Prod_Prix" Type="Decimal" />
<asp:Parameter Name="Prod_Image" Type="String" />
<asp:Parameter Name="Cat_Id" Type="Int32" />
<asp:Parameter Name="Prod_Id" Type="Int32" />
</UpdateParameters>
</asp:SqlDataSource>
<asp:DetailsView ID="DetailsView1" runat="server" Height="50px" Width="125px"
AutoGenerateRows="False" DataKeyNames="Prod_Id" DataSourceID="dsProduit">
<Fields>
<asp:BoundField DataField="Prod_Id" HeaderText="Référence"
InsertVisible="False" ReadOnly="True" SortExpression="Prod_Id" />
<asp:BoundField DataField="Prod_Nom" HeaderText="Nom de Produit"
SortExpression="Prod_Nom" />
<asp:BoundField DataField="Prod_Texte" HeaderText="Texte"
SortExpression="Prod_Texte" />
<asp:BoundField DataField="Prod_Prix" DataFormatString="{0:C}"
HeaderText="Prix" SortExpression="Prod_Prix" />
<asp:BoundField DataField="Prod_Image" HeaderText="Nom de l'Image"
SortExpression="Prod_Image" />
<asp:TemplateField HeaderText="Catégorie" SortExpression="Cat_Id">
<EditItemTemplate>
<asp:SqlDataSource ID="dsCategorie" runat="server"
ConnectionString="<%$ ConnectionStrings:csSigneEtSens %>"
SelectCommand="SELECT [Cat_Id], [Cat_Nom] FROM [Categorie] ORDER BY [Cat_Nom]"></asp:SqlDataSource>
<asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="dsCategorie"
DataTextField="Cat_Nom" DataValueField="Cat_Id"
SelectedValue='<%# Bind("Cat_Id") %>' AppendDataBoundItems="True">
</asp:DropDownList>
<div id="linkbuttons">
<asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="false"
onclick="LinkButton1_Click">Ajouter</asp:LinkButton> |
<asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="false"
onclick="LinkButton2_Click">Modifier</asp:LinkButton> |
<asp:LinkButton ID="LinkButton3" runat="server" CausesValidation="false"
onclick="LinkButton3_Click">Supprimer</asp:LinkButton>
</div>
<div id="text">
<asp:Label ID="Label1" runat="server"></asp:Label>
<asp:TextBox ID="TextBox1" runat="server" CausesValidation="false"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Valider" onclick="Button1_Click" />
<asp:Button ID="Button3" runat="server" Text="Valider" CausesValidation="false" onclick="Button3_Click"/>
<asp:Button ID="Button2" runat="server" Text="Annuler" CausesValidation="false" />
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox1" ErrorMessage="RequiredFieldValidator">
</asp:RequiredFieldValidator>
</div>
</EditItemTemplate>
<InsertItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Cat_Id") %>'></asp:TextBox>
</InsertItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("Cat_Nom") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
</Fields>
</asp:DetailsView> |
Et voici le code behind d'un des trois boutons qui gère l'ajout de catégories :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim ConnectionString As String = System.Configuration.ConfigurationManager.ConnectionStrings("csSigneEtSens").ToString
Dim Connection As SqlConnection = New SqlConnection(ConnectionString)
Connection.Open()
If Etat2.Mode = "Ajout" Then
Dim Command As SqlCommand = New SqlCommand("INSERT INTO [Categorie] ([Cat_Nom]) VALUES (@Cat_Nom)")
Command.Connection = Connection
Command.CommandType = Data.CommandType.Text
Command.Parameters.Add(New SqlParameter("@Cat_Nom", Data.SqlDbType.NVarChar))
Command.Parameters("@Cat_Nom").Value = CType(DetailsView1.FindControl("TextBox1"), TextBox).Text
Command.ExecuteNonQuery()
CType(DetailsView1.FindControl("DropDownList1"), DropDownList).DataBind()
CType(DetailsView1.FindControl("Label1"), Label).ForeColor = Drawing.Color.Red
CType(DetailsView1.FindControl("Label1"), Label).Text = "Catégorie ajoutée!"
CType(DetailsView1.FindControl("TextBox1"), TextBox).Text = ""
ElseIf Etat2.Mode = "Modification" Then
Dim Command As SqlCommand = New SqlCommand("UPDATE [Categorie] SET [Cat_Nom] = @Cat_Nom WHERE [Cat_Id] = @Cat_Id")
Command.Connection = Connection
Command.CommandType = Data.CommandType.Text
Command.Parameters.Add(New SqlParameter("@Cat_Nom", Data.SqlDbType.NVarChar))
Command.Parameters.Add(New SqlParameter("@Cat_Id", Data.SqlDbType.Int))
Command.Parameters("@Cat_Nom").Value = CType(DetailsView1.FindControl("TextBox1"), TextBox).Text
Command.Parameters("@Cat_Id").Value = CType(DetailsView1.FindControl("DropDownList1"), DropDownList).SelectedValue
Command.ExecuteNonQuery()
CType(DetailsView1.FindControl("DropDownList1"), DropDownList).DataBind()
CType(DetailsView1.FindControl("Label1"), Label).ForeColor = Drawing.Color.Red
CType(DetailsView1.FindControl("Label1"), Label).Text = "Catégorie modifiée !"
CType(DetailsView1.FindControl("TextBox1"), TextBox).Text = ""
End If
Connection.Close()
End Sub |
Merci d'avance pour votre aide.