Ciao a tutti,

ho un problema con un DataList.
Sto realizzando un sito multilingua, non posso prevedere a priori quante e quali lingue verrano utilizzate e devo dunque creare dei controlli per permettere all'utente di inserire delle informazioni in più lingue. Ho quindi realizzato un UserControl che crea una bandierina e una textbox per ogni lingua installata sfruttando un datalist:

codice:
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="MultilanguageText.ascx.vb" Inherits="App_Controls_MultilanguageText" %>
<%@ Register src="MultilanguageImage.ascx" tagname="MultilanguageImage" tagprefix="uc2" %>

<asp:DataList ID="dtlValues" runat="server" >
    <ItemTemplate>
         <uc2:MultilanguageImage ID='mlImage' runat="server" ResourceName="images/flag.gif" Language='<%# Eval("Key") %>' Height="20px" ImageAlign="AbsMiddle" AutoCreate="false"  />
         <asp:TextBox ID='txt' runat="server" Text='<%# Eval("Value") %>'></asp:TextBox>         
    </ItemTemplate>
</asp:DataList>


<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
MultilanguageImage non è altro che un'immagine un po' più evoluta.
TextBox1 è inserita a scopo di test

Dunque assegno il Datasource da codice in questo modo:

codice:
   Public Property Value() As MultilanguageString
        Get
            UpdateMultilanguageString()
            Return _multilanguageString
        End Get
        Set(ByVal value As MultilanguageString)
            _multilanguageString = value
        End Set
    End Property

    Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
        BindValues()
    End Sub

    Private Sub BindValues()
        For Each lang As String In Configuration.Languages
            Try
                If _multilanguageString(lang) Is Nothing Then
                    _multilanguageString(lang) = ""
                End If
            Catch ex As Exception
                _multilanguageString(lang) = ""
            End Try
        Next
        dtlValues.DataSource = _multilanguageString
        dtlValues.DataBind()
    End Sub

    Private Sub UpdateMultilanguageString()
        Dim lang As String = ""
        Dim value As String = ""

        For Each item As DataListItem In dtlValues.Items
            lang = TryCast(item.Controls(0), App_Controls_MultilanguageImage).Language
            value = TryCast(item.Controls(1), TextBox).Text
            _multilanguageString(lang) = value
        Next
    End Sub
MultilanguageString è in pratica un Dictionary avente come Key il codice della lingua e come Value la stringa nella lingua corrispondente.

Ho piazzato quindi questo controllo all'interno di un DetailsView:

codice:
            <asp:DetailsView ID="dvwRecord" runat="server" AutoGenerateRows="False" 
                CellPadding="4" DataKeyNames="Id" DataSourceID="odsLocation" 
                ForeColor="#333333" GridLines="None" Height="50px" Width="300px">
                <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                <CommandRowStyle BackColor="#E2DED6" Font-Bold="True" />
                <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
                <FieldHeaderStyle BackColor="#E9ECF1" Font-Bold="True" />
                <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
                <Fields>
                    <asp:BoundField DataField="Id" HeaderText="Codice" 
                        InsertVisible="False" ReadOnly="True" SortExpression="Id" />
                    <asp:TemplateField HeaderText="Location">
                        <EditItemTemplate>
                            <uc2:MultilanguageText ID="MultilanguageText1" runat="server" 
                                Value='<%# Bind("Name") %>' />
                        </EditItemTemplate>
                        <InsertItemTemplate>
                            <uc2:MultilanguageText ID="MultilanguageText1" runat="server" 
                                Value='<%# Bind("Name") %>' />
                        </InsertItemTemplate>
                        <ItemTemplate>
                            <uc3:MultilanguageLabel ID="MultilanguageLabel1" runat="server" EnableViewState="False" Value='<%# Eval("Name") %>'/>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" 
                        ShowInsertButton="True" />
                </Fields>
                <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                <EditRowStyle BackColor="#999999" />
                <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
            </asp:DetailsView>

            <asp:ObjectDataSource ID="odsLocation" runat="server" 
                SelectMethod="GetLocation" TypeName="BLL.Location" 
                InsertMethod="Insert">
                <SelectParameters>
                    <asp:ControlParameter ControlID="ddlRecords" Name="id" 
                        PropertyName="SelectedValue" Type="Int32" />
                </SelectParameters>
                <InsertParameters>
                    <asp:Parameter  Name="Name" Type="Object"/>
                </InsertParameters>
            </asp:ObjectDataSource>
Lanciando l'applicazione e mandando in modifica il DetailsView, il DataList si popola correttamente. In questo codice è implementata solo la procedura di inserimento, ma anche in modifica il problema non cambia, ovvero, al momento del postback (Inserisci, Aggiorna)quando viene chiamata la Property Value del mio UserControl la Datalist non contiene più alcun Item, non riesco dunque a recuperare ciò che è stato editato dell'utente.
Ma se scrivo qualcosa nella TextBox1 che ho inserito per prova riesco a recuperarlo.

Perchè il datalist non viene postato al server?
Spero che qualcuno possa aiutarmi.

Grazie!