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:
MultilanguageImage non è altro che un'immagine un po' più evoluta.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>
TextBox1 è inserita a scopo di test
Dunque assegno il Datasource da codice in questo modo:
MultilanguageString è in pratica un Dictionary avente come Key il codice della lingua e come Value la stringa nella lingua corrispondente.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
Ho piazzato quindi questo controllo all'interno di un DetailsView:
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.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>
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!![]()

Ciao a tutti,
Rispondi quotando