Problème de Bind dans un User Control basé sur un ListView avec des Template
Bonjour,
Je suis en train de créer un UserControl dont voici l'ascx :
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
| <%@ Control Language="vb" AutoEventWireup="false" CodeBehind="PivotTable.ascx.vb" Inherits="PAPAGEI.PivotTable" %>
<asp:ListView ID="ListView" runat="server" ItemPlaceholderID="PlaceHolder">
<LayoutTemplate>
<table>
<tbody>
<asp:PlaceHolder ID="Placeholder" runat="server"/>
</tbody>
</table>
</LayoutTemplate>
<ItemTemplate>
<tr>
<asp:PlaceHolder ID="ItemPlaceHolder" runat="server" />
<td>
<asp:ImageButton ID="EditButton" runat="server" ImageUrl="~/App_Themes/Default/Images/Edit.png" CommandName="Edit"/>
</td>
</tr>
</ItemTemplate>
<EditItemTemplate>
<tr>
<asp:PlaceHolder ID="EditItemPlaceHolder" runat="server" />
<td>
<asp:ImageButton ID="UpdateButton" runat="Server" ImageUrl="~/App_Themes/Default/Images/Validate.png" CommandName="Update"/>
<asp:ImageButton ID="CancelButton" runat="Server" ImageUrl="~/App_Themes/Default/Images/Back.png" CommandName="Cancel" CausesValidation="false"/>
</td>
</tr>
</EditItemTemplate>
<InsertItemTemplate>
<tr>
<asp:PlaceHolder ID="InsertItemPlaceHolder" runat="server" />
<td>
<asp:ImageButton ID="InsertButton" runat="Server" ImageUrl="~/App_Themes/Default/Images/Validate.png" CommandName="Insert"/>
</td>
</tr>
</InsertItemTemplate>
</asp:ListView> |
Voici le code behind associé (PivotTable.ascx.vb)
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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
| Imports System.ComponentModel
<DefaultProperty("SelectedValue")> _
Public Class PivotTable
Inherits System.Web.UI.UserControl
Private m_ItemTemplate As ITemplate = Nothing
Private m_EditItemTemplate As ITemplate = Nothing
Private m_InsertItemTemplate As ITemplate = Nothing
<BrowsableAttribute(False)> _
Public ReadOnly Property SelectedValue As Object
Get
Return ListView.SelectedValue
End Get
End Property
<Category("Data")> _
Public Property DataSourceID As String
Get
Return ListView.DataSourceID
End Get
Set(ByVal DataSourceID As String)
ListView.DataSourceID = DataSourceID
End Set
End Property
<TypeConverterAttribute(GetType(StringArrayConverter))> _
<Category("Data")> _
Public Overridable Property DataKeyNames As String()
Get
Return ListView.DataKeyNames
End Get
Set(ByVal DataKeyNames As String())
ListView.DataKeyNames = DataKeyNames
End Set
End Property
<Category("Misc")> _
Public Property InsertItemPosition As InsertItemPosition
Get
Return ListView.InsertItemPosition
End Get
Set(ByVal InsertItemPosition As InsertItemPosition)
ListView.InsertItemPosition = InsertItemPosition
End Set
End Property
<BrowsableAttribute(False)> _
<PersistenceModeAttribute(PersistenceMode.InnerProperty)> _
<TemplateContainerAttribute(GetType(INamingContainer), BindingDirection.TwoWay)> _
Public Property ItemTemplate() As ITemplate
Get
Return m_ItemTemplate
End Get
Set(ByVal Template As ITemplate)
m_ItemTemplate = Template
End Set
End Property
<BrowsableAttribute(False)> _
<PersistenceModeAttribute(PersistenceMode.InnerProperty)> _
<TemplateContainerAttribute(GetType(INamingContainer), BindingDirection.TwoWay)> _
Public Property EditItemTemplate() As ITemplate
Get
Return m_EditItemTemplate
End Get
Set(ByVal Template As ITemplate)
m_EditItemTemplate = Template
End Set
End Property
<BrowsableAttribute(False)> _
<PersistenceModeAttribute(PersistenceMode.InnerProperty)> _
<TemplateContainerAttribute(GetType(INamingContainer), BindingDirection.TwoWay)> _
Public Property InsertItemTemplate() As ITemplate
Get
Return m_InsertItemTemplate
End Get
Set(ByVal Template As ITemplate)
m_InsertItemTemplate = Template
End Set
End Property
Private Sub ListView_ItemCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ListViewItemEventArgs) Handles ListView.ItemCreated
If Not ItemTemplate Is Nothing Then
With e.Item
If Not .FindControl("ItemPlaceHolder") Is Nothing Then
ItemTemplate.InstantiateIn(.FindControl("ItemPlaceHolder"))
End If
End With
End If
If Not EditItemTemplate Is Nothing Then
With e.Item
If Not .FindControl("EditItemPlaceHolder") Is Nothing Then
EditItemTemplate.InstantiateIn(.FindControl("EditItemPlaceHolder"))
End If
End With
End If
If Not InsertItemTemplate Is Nothing Then
With e.Item
If Not .FindControl("InsertItemPlaceHolder") Is Nothing Then
InsertItemTemplate.InstantiateIn(.FindControl("InsertItemPlaceHolder"))
End If
End With
End If
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
End Sub
End Class |
J'utilise ce User Control de cette manière :
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
| <%@ Register Src="~/Controls/PivotTable.ascx" TagName="PivotTable" TagPrefix="papagei" %>
<asp:SqlDataSource
ID="SqlDataSourceCountries"
runat="server"
ConnectionString='<%$ ConnectionStrings:PAPAGEIConnectionString %>'
SelectCommand="
SELECT [V_TEXT_TRANSLATION].TEXT_ID,
[V_TEXT_TRANSLATION].CODE
FROM [common].[L_COUNTRY] INNER JOIN [current].[V_TEXT_TRANSLATION]
ON [L_COUNTRY].[TEXT_ID] = [V_TEXT_TRANSLATION].[TEXT_ID]
WHERE [V_TEXT_TRANSLATION].[LANGUAGE] = @@LANGUAGE
ORDER BY [V_TEXT_TRANSLATION].[TEXT];
"
UpdateCommand="
UPDATE [current].[T_TEXT]
SET CODE = @CODE
WHERE TEXT_ID = @TEXT_ID;
"
InsertCommand="
DECLARE @TEXT_ID [uniqueidentifier];
SET @TEXT_ID = NEWID();
INSERT INTO [current].[T_TEXT]
( TEXT_ID, CODE )
VALUES
( @TEXT_ID, @CODE );
INSERT INTO [common].[L_COUNTRY]
( TEXT_ID )
VALUES
( @TEXT_ID );
"
ProviderName='<%$ ConnectionStrings:PAPAGEIConnectionString.ProviderName %>'>
<UpdateParameters>
<asp:Parameter Name="TEXT_ID" DbType="Guid" />
<asp:Parameter Name="CODE" DbType="String" />
</UpdateParameters>
<InsertParameters>
<asp:Parameter Name="CODE" DbType="String" />
</InsertParameters>
</asp:SqlDataSource>
<papagei:PivotTable
ID="PivotTable"
runat="server"
DataSourceID="SqlDataSourceCountries"
DataKeyNames="TEXT_ID"
InsertItemPosition="LastItem"
>
<ItemTemplate>
<td>
<asp:Label ID="CodeLabel" runat="server" Text='<%#Eval("CODE")%>' />
</td>
</ItemTemplate>
<EditItemTemplate>
<td>
<asp:TextBox ID="CodeTextBox2" runat="server" Text='<%#Bind("CODE")%>'/>
</td>
</EditItemTemplate>
<InsertItemTemplate>
<td>
<asp:TextBox ID="CodeTextBox1" runat="server" Text='<%#Bind("CODE")%>' />
</td>
</InsertItemTemplate>
</papagei:PivotTable> |
Lorsque je suis en affichage normal pas de soucis, le CODE s'affiche bien, par contre dès que je suis en mode édition (EditItemTemplate) ou en mode insertion (InsertItemTemplate) le code initial dans la TextBox est Ok mais lorsque je clique sur le bouton Update ou Insert une valeur Vide est transmise à la base de données, la valeur saisie dans la TextBox n'est pas transmise à la base : en conclusion l'Eval("CODE") - one way binding -fonctionne mais pas le Bind("CODE") -two way binding.
Quelqu'un peut-il m'aider ?