Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    54

    Localizzazione DataGrid (per esperti!)

    Ciao a tutti!
    Ho un problemino, che subito vi illustrerò.

    Ho creato dei datagrid personalizzati con colonne Template per la modifica, l'inserimento e la cancellazione dei files.

    I datagrid vengono popolati da una datasource ad hoc nel codebehind e di recente è sorto il problema di localizzare il tutto.

    Per risolvere il problema ho approntato una serie di assembly satellite con le risorse di ogni lingua e al momento della popolazione della pagina uso un ResourceManager per avere le stringhe relative alla lingua in uso.

    Lo stesso procedimento avviene facilmente anche per tutti gli oggetti del codebehind. Per gli header dei datagrid, ad esempio, uso un costrutto del tipo:
    codice:
    ResourceManager rm = new ResourceManager()...
    
    foreach(DataGridColumn colonna in MioDataGrid.Columns)
    {
    
      if (colonna.HeaderText=="NomeCampoIniziale")
      {
       colonna.HeaderText=rm.GetString("ChiavePerCampoNoto");
      }  
    }
    dove NomeCampoIniziale corrisponde allo HeaderText di una TemplateColumn del codice ASP.NET


    IL Problema sorge quando devo cambiare il testo contenuto in un LinkButton di una EditCommandColumn appartenente ai templates.
    Qualcuno ha idea di come accedervi??




    ecco un paio di spezzoni del codice:
    Parte ASP.NET
    codice:
     <asp:DataGrid id="DataGrid1" runat="server" AllowSorting="true" OnUpdateCommand="DataGridUpdateCommand" OnCancelCommand="DataGridCancelCommand" OnEditCommand="DataGridEditCommand" OnDeleteCommand="DataGridDeleteCommand" showfooter="false" >
                            <FooterStyle cssclass="TabellaBluFooter"></FooterStyle>
                            <HeaderStyle cssclass="TabellaBluHeader"></HeaderStyle>
                            <PagerStyle horizontalalign="Left" mode="NumericPages"></PagerStyle>
                            <SelectedItemStyle ></SelectedItemStyle>
                            <EditItemStyle cssclass="TabellaBluRigaEdit"></EditItemStyle>
                            <ItemStyle cssclass="TabellaBluRigaBianca"></ItemStyle>
                            <AlternatingItemStyle cssclass="TabellaBluRigaAzzurra"></AlternatingItemStyle>
                            <Columns>
                                <asp:TemplateColumn HeaderText="Ora Inizio">
                                    <ItemTemplate>
                                        <asp:Label runat="server" text='<%# DataBinder.Eval(Container.DataItem, "inizio") %>' style="width:5em;" />
                                    </ItemTemplate>
                                    <EditItemTemplate>
                                        <asp:TextBox runat="server" id="edit_inizio" Text='<%# DataBinder.Eval(Container.DataItem, "inizio") %>' style="width:5em;" />
                                        <n0:RequiredDOMValidator id="RequiredFieldValidator1" runat="server" ErrorMessage="campo inizio richiesto" ControlToValidate="edit_inizio" Display="Dynamic">campo Inizio richiesto</n0:RequiredDOMValidator>
                                        <n0:RegexDOMValidator id="RegularExpressionValidator1" runat="server" ErrorMessage="campo inizio non valido" ControlToValidate="edit_inizio" ValidationExpression="^((0?[1-9]|1[012])([:]){0,1}([0-5]\d){0,2}(\ Travel [ap]M))$|^([01]\d|2[0-3])([:]){0,1}([0-5]\d){1,2}$" Display="Dynamic"></n0:RegexDOMValidator>
                                    </EditItemTemplate>
                                    <FooterTemplate></FooterTemplate>
                                </asp:TemplateColumn>
                                <asp:TemplateColumn HeaderText="Ora Fine">
                                    <ItemTemplate>
                                        <asp:Label runat="server" text='<%# DataBinder.Eval(Container.DataItem, "fine") %>' style="width:5em;" />
                                    </ItemTemplate>
                                    <EditItemTemplate>
                                        <asp:TextBox runat="server" id="edit_fine" Text='<%# DataBinder.Eval(Container.DataItem, "fine") %>' style="width:5em;" />
                                        <n0:RequiredDOMValidator id="RequiredFieldValidator2" runat="server" ErrorMessage="campo fine richiesto" ControlToValidate="edit_fine" Display="Dynamic">campo fine richiesto</n0:RequiredDOMValidator>
                                        <n0:RegexDOMValidator id="RegularExpressionValidator2" runat="server" ErrorMessage="campo fine non valido" ControlToValidate="edit_fine" ValidationExpression="^((0?[1-9]|1[012])([:]){0,1}([0-5]\d){0,2}(\ Travel [ap]M))$|^([01]\d|2[0-3])([:]){0,1}([0-5]\d){1,2}$" Display="Dynamic"></n0:RegexDOMValidator>
                                    </EditItemTemplate>
                                </asp:TemplateColumn>
                                <asp:EditCommandColumn ButtonType="LinkButton" UpdateText="Aggiorna" HeaderText="Cambia" CancelText="Annulla" EditText="Modifica" >
                                    <HeaderStyle width="7em"></HeaderStyle>
                                </asp:EditCommandColumn>
                                <asp:ButtonColumn Text="Elimina" CommandName="Delete" />
                            </Columns>
                        </asp:DataGrid>
    Parte del CodeBehind
    codice:
    		public static void TraduciDataGrid(ref DataGrid DataGrid1,ResourceManager rm)
    		{
    		
    		 foreach(DataGridColumn colonna in DataGrid1.Columns)
      		 {
      		 	if (colonna.HeaderText=="Ora Inizio")
      		 	{
      		 	 colonna.HeaderText=rm.GetString("CampoOraInizio");  		 	 
      		 	}


    Una birra a chi mi da una mano
    Ciao A tutti e scusate la lunghezza..

  2. #2
    linkbutton myLink = (linkbutton)e.items.findcontrol("nomelinkbutton");
    mylink.proprietà_che_non_ricordo = "pippo";

    prova ho scritto cosi a braccio

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    54
    magari fosse cosi facile!
    i linkbutton in questione derivano dalla riga
    codice:
    <asp:EditCommandColumn ButtonType="LinkButton" UpdateText="Aggiorna" HeaderText="Cambia" CancelText="Annulla" EditText="Modifica" >
    alla quale non è possibile assegnare uno ID. Inoltre ci sarà un linkbutton per ogni riga ...

  4. #4
    Utente di HTML.it L'avatar di edaje
    Registrato dal
    Jul 2003
    Messaggi
    363
    Il tuo problema non è semplice. Potresti fare così. Non usare L'EditCommandColumn ma realizza tu una colonna con i linkButton a cui assegni un tuo ID e fai come dice Daniele.

    Altimenti se vuoi usarla nell'evento ItemCreated puoi fare un ciclo all'interno della collezione di controlli di quella cella. All'interno di un blocco try catch fai il "casting" dei controlli con un linkbutton. Quando ne trovi uno verifichi la proprietà Text cos' sai che genere di bottone è (Update, Cancel etc...).

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    54
    Buona Idea Come al solito ci sono tanti eventi e quello che mi serviva non lo avevo trovato.

    Posto il loop di ordine dannatamente N2 che ho ottenuto:
    codice:
     protected void DataGridItemTranslations(object Sender,DataGridItemEventArgs e)
          {
    
          	foreach(TableCell myCell in e.Item.Controls)
          	{
          		LinkButton Bottone;
          		try 
          		{
          			foreach(Control iCtr in myCell.Controls)
          			{
          				Bottone = (LinkButton) iCtr;
          				if (Bottone.Text=="Aggiorna")
          				{
    	      				Bottone.Text="AggiornaNEW";
        	  			}
          				if (Bottone.Text=="Annulla")
          				{
          					Bottone.Text="AnnullaNEW";
          				}
          				if (Bottone.Text=="Modifica")
          				{
    	      				Bottone.Text="ModificaNEW";
        	  			}
          				if (Bottone.Text=="Elimina")
          				{
          					Bottone.Text="EliminaNew";
          				}
          			}
          				
          		}
          		catch(Exception )
          		{
          		//gli altri li lascio stare
          		}
          		
          	
          	}
          }
    Sicuramente sarebbe stato più elegante implementare delle templatecolumns dinamicamente ed assegnare i linkbutton come si deve

    Purtroppo però non ho trovato molti esempi in giro e soprattutto agendo come sopra si può lavorare con le template definite nel codice ASP.net e senza la necessita di caricare un template da codebehind..

    La prossima volta che passo a Milano verrò personalmente a pagarti la birra dovuta

  6. #6
    Utente di HTML.it L'avatar di edaje
    Registrato dal
    Jul 2003
    Messaggi
    363
    Ottima idea, sono un grande estimatore della birra.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    54
    ALTRO MODO !
    Con lo stratagemma che abbiamo discusso sopra le cose funzionano, ma nel caso del linkbutton "Annulla" la selezione non avviene correttamente (probabilmente perchè tale oggetto appartiene solo al template di modifica)

    Invece di usare una EditCommandColumn ed impazzire dal CodeBehind,
    basta caricare il resourceManager per la traduzione anche nella pagina ASP.net con:
    codice:
    <%@Import namespace="System.Globalization"%>
    <%@Import namespace="System.Resources"%>
    <%@Import namespace="System.Threading"%>
    <%@Import namespace="System.IO"%>
    
    <%@ import Namespace="System.Reflection" %>
    <%
      ResourceManager rm = (ResourceManager) Application["RM"];
      Response.Write(rm.GetString("TariffeGiornaliere"));
    %>
    e poi SOSTITUIRE LA EditCommandColumn con una TemplateColumn che ne mimi il comportamento

    codice:
    <asp:TemplateColumn HeaderText="Cambia">
      <ItemTemplate>
       <asp:LinkButton runat="server" CommandName="Edit"><%# rm.GetString("Modifica") %>
       </asp:LinkButton>
      </ItemTemplate>
     <EditItemTemplate>
        <asp:LinkButton runat="server" CommandName="Update"><%# rm.GetString("Aggiorna") %>
        </asp:LinkButton>
        <asp:LinkButton runat="server" CommandName="Cancel"><%# rm.GetString("Annulla") %>
        </asp:LinkButton>
     </EditItemTemplate>
    </asp:TemplateColumn>
    In tal modo si hanno a disposizione le stringhe con i comandi e si possono usare i tag server di binding <#% e %> per richiamare il
    resourceManager ed avere la traduzione

    Direi che è un po' meno macchinoso (Odio gli algoritmi di ordine>1!!)

    Bye Bye

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.