{"id":22671,"date":"2025-12-31T10:00:33","date_gmt":"2025-12-31T09:00:33","guid":{"rendered":"http:\/\/help.qualiware.it\/qw-help\/?p=22671"},"modified":"2026-01-02T11:48:26","modified_gmt":"2026-01-02T10:48:26","slug":"fd-grid","status":"publish","type":"post","link":"https:\/\/help.qualiware.it\/qw-help\/fd-grid\/","title":{"rendered":"OGGETTO GRIGLIA"},"content":{"rendered":"<h4 align=\"left\"><a name=\"progettazione_form_proprieta\"><\/a>Descrizione<\/h4>\n<p>L&#8217;oggetto <strong>Griglia<\/strong> consente la visualizzazione di informazioni sotto forma di tabella modificabile. Dalla release <strong><span style=\"color: #993300;\">release<\/span><span style=\"color: #993300;\"> 2023.02.00 <\/span><\/strong>dalla \u00e8 disponibile una nuova versione, attivabile assegnando la propriet\u00e0 NuovoLayout=true. Le funzionalit\u00e0 aggiunte o modificate sono evidenziate in colore <span style=\"background-color: #ffff00;\">giallo<\/span>. Nel paragrafo <a href=\"#migrazione\">Migrazione<\/a> sono riportate alcune indicazioni utili ad agevolare la migrazione delle griglie esistenti al nuovo layout.<\/p>\n<p><a href=\"https:\/\/help.qualiware.it\/qw-help\/wp-content\/uploads\/columns_editing_IT.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-27225\" src=\"https:\/\/help.qualiware.it\/qw-help\/wp-content\/uploads\/columns_editing_IT.png\" alt=\"\" width=\"541\" height=\"501\"><\/a><\/p>\n<p><span style=\"background-color: #ffff00;\"><strong> NOTA IMPORTANTE<\/strong>: per motivi di performance legati alla struttura dell&#8217;oggetto, se NuovoLayout=true eventuali aggiornamenti di altri oggetti del form effettuati all&#8217;interno dei gestori di questi eventi (ad esempio l&#8217;assegnazione di un testo ad un&#8217;etichetta, oppure l&#8217;assegnazione di un valore ad un campo), <strong>non <\/strong>comporteranno l&#8217;aggiornamento grafico del form . Per aggiornare anche visivamente questi oggetti, \u00e8 necessario inserirli in un <a style=\"background-color: #ffff00;\" href=\"https:\/\/help.qualiware.it\/qw-help\/fd-contenitore\/\">oggetto contenitore<\/a> con la propriet\u00e0 <strong>ContenitoreAggiornamento<\/strong> assegnata a <em>true<\/em>, e, nel gestore dell&#8217;evento, richiamare il metodo <strong>UpdateContainer<\/strong> dell&#8217;<a style=\"background-color: #ffff00;\" href=\"https:\/\/help.qualiware.it\/qw-help\/fd-form\/\">oggetto form<\/a> specificando come parametro il contenitore stesso.<\/span><\/p>\n<p>NOTA: le propriet\u00e0 e i metodi riportati nel seguito e preceduti dal carattere &#8220;*&#8221; non sono disponibili nella versione mobile.<\/p>\n<h4 align=\"left\"><a name=\"progettazione_form_proprieta\"><\/a>Propriet\u00e0 specifiche<\/h4>\n<p>Oltre alle propriet\u00e0 comuni (<a href=\"http:\/\/help.qualiware.it\/qw-help\/fd-proprieta-comuni\/\">vedi<\/a>) sono disponibili le seguenti propriet\u00e0:<\/p>\n<ul>\n<li><span style=\"background-color: #ffff00;\"><b><span style=\"color: #993300;\">*NuovoLayout: <\/span><\/b>se <i>True<\/i> viene utilizzato il layout aggiornato disponibile dalla versione 2023.02.00. Il default \u00e8 <em>True<\/em> per gli oggetti creati con questa versione o successiva.<\/span><\/li>\n<li><span style=\"color: #993300;\"><strong><span style=\"color: #993300;\">CampoFiltro <\/span><\/strong><span style=\"color: #000000;\">e<\/span><strong><span style=\"color: #993300;\"> ValoreCampoFiltro:<br \/>\n<\/span><\/strong><\/span>In un form \u00e8 possibile inserire pi\u00f9 di una griglia. Dal momento che i dati delle griglie vengono memorizzati nella tabella <em>DOC_ROWS<\/em> del database, \u00e8 necessario definire il set di righe che fa riferimento a ciascuna griglia. Lo si pu\u00f2 fare definendo la propriet\u00e0 <em>CampoFiltro<\/em>&nbsp;indicando il campo sul quale verr\u00e0 effettuato il filtro, e la propriet\u00e0 <em>ValoreCampoFiltro<\/em>&nbsp;nella quale verr\u00e0 specificato il valore da controllare. Nella griglia verranno quindi caricate le sole righe della tabella <em>DOC_ROWS<\/em> che soddisfano il filtro, e ogni riga aggiunta verr\u00e0 memorizzata con il campo specificato nella propriet\u00e0 <em>CampoFiltro<\/em> assegnato al valore specificato nella propriet\u00e0 <em>ValoreCampoFiltro<\/em>.<br \/>\nTutte le griglie presenti in un form dovranno avere lo stesso valore della propriet\u00e0 <em>CampoFiltro<\/em> e valori differenti della propriet\u00e0 <em>ValoreCampoFiltro<\/em>, in modo da fare riferimento a set di righe di <em>DOC_ROWS<\/em> diversi.<\/li>\n<li><span style=\"background-color: #ffff00;\"><span style=\"color: #993300;\"><strong><span style=\"color: #993300;\">*GrigliaFiglia <\/span><\/strong><span style=\"color: #000000;\">e<\/span><strong><span style=\"color: #993300;\"> *CampoFiltroGrigliaFiglia:<br \/>\n<\/span><\/strong><\/span>Se <em>NuovoLayout=true<\/em> \u00e8 possibile collegare due griglie in modo da mostrare, per ogni riga della prima, le corrispondenti righe della seconda, il cui nome deve essere specificato nella propriet\u00e0 <em>GrigliaFiglia<\/em>. Le due griglie sono collegate da una colonna in comune, che deve essere inserita&nbsp; nella propriet\u00e0 <em>CampoFiltroGrigliaFiglia<\/em>. Tale campo deve essere collegato ad una colonna in entrambe le griglie. Sia nella griglia principale che in quella figlia, tale colonna deve avere <em>Richiesto=true <\/em>e <em>ChiavePrimaria=true.<\/em> Nella griglia figlia la colonna verr\u00e0 automaticamente nascosta.<\/span><\/li>\n<li><strong><strong><span style=\"color: #993300;\">Colonne:<br \/>\n<\/span><\/strong><\/strong>Questa propriet\u00e0&nbsp;consente di definire l&#8217;insieme delle colonne che comporranno la griglia. Ciascuna colonna disporr\u00e0 a sua volta di propriet\u00e0 specifiche che sono elencate nel seguito.<\/p>\n<ul>\n<li><span style=\"color: #993300;\"><strong>Intestazione<\/strong><\/span>: intestazione della colonna<\/li>\n<li><strong><span style=\"color: #993300;\">Larghezza<\/span><\/strong>: larghezza della colonna in pixel<\/li>\n<li><span style=\"color: #993300;\"><strong>Campo<\/strong><\/span>: campo della tabella <em>DOC_ROWS<\/em> collegato alla colonna<\/li>\n<li><span style=\"color: #993300;\"><strong>ChiavePrimaria<\/strong><\/span>: se <em>true<\/em>, la colonna fa parte dell&#8217;insieme che compone la chiave primaria<\/li>\n<li><span style=\"color: #993300;\"><strong>FormatoNumerico<\/strong><\/span>: consente di specificare quanti decimali visualizzare se la colonna \u00e8 di tipo numerico<\/li>\n<li><strong><span style=\"color: #993300;\">QueryLista<\/span><\/strong>: query da utilizzare per visualizzare i dati fra i quali \u00e8 possibile scegliere il valore del campo. Per fare in modo che i valori ritornati dalla query vengano mostrati in una lista a discesa, anzich\u00e8 in una finestra a parte attivata da un apposito pulsante, specificare l&#8217;alias &#8220;DROPDOWN_VALUE&#8221; nel campo che dovr\u00e0 essere utilizzato per alimentare la lista a discesa stessa. E&#8217; possibile utilizzare, nei filtri presenti nella query, i valori dei campi presenti nel form, utilizzando come nome di parametro il nome del campo del database cui sono collegati o, per gli oggetti non collegati, il nome dell&#8217;oggetto stesso.<br \/>\n<span style=\"background-color: #ffff00;\">NOTA: se <em>NuovoLayout=true&nbsp;<\/em>\u00e8 possibile specificare un secondo campo, che sar\u00e0 il valore memorizzato nel campo associato, mentre la prima colonna dovr\u00e0 essere quella con alias &#8220;DROPDOWN_VALUE&#8221; e specificher\u00e0 il valore mostrato nella tendina.<\/span><\/li>\n<li><span style=\"color: #993300;\"><strong>Richiesto<\/strong><\/span>: se <em>true<\/em> \u00e8 obbligatorio l&#8217;inserimento dei dati nella colonna<\/li>\n<li><span style=\"color: #993300;\"><strong>SeparatoreMigliaia<\/strong><\/span>: se <em>true<\/em>&nbsp;abilita la visualizzazione del&nbsp;separatore delle migliaia nelle colonne di tipo numerico<\/li>\n<li><span style=\"color: #993300;\"><strong>SolaLettura<\/strong><\/span>: se <em>true<\/em> la colonna \u00e8 a sola lettura<\/li>\n<li><span style=\"color: #993300;\"><strong>TuttoMaiuscole<\/strong><\/span>: se <em>true<\/em> il valore &nbsp;inserito verr\u00e0 convertito in tutte maiuscole<\/li>\n<li><span style=\"color: #993300;\"><strong>VincolatoAllaLista<\/strong><\/span>: se <em>true<\/em> non \u00e8 possibile inserire un valore manualmente ma pu\u00f2 solo essere scelto dalla lista<\/li>\n<\/ul>\n<p>L&#8217;insieme delle righe pu\u00f2 inoltre essere caratterizzato da una o pi\u00f9 colonne che fungono da chiave primaria, identificate assegnando la propriet\u00e0 <em>ChiavePrimaria=true<\/em>, impedendo quindi l&#8217;inserimento di righe che presentano lo stesso valore per tali colonne.<\/p>\n<p><span style=\"color: #000000; background-color: #ffff00;\">NOTE IMPORTANTI<br \/>\n<\/span>1) Per i form collegati a categorie documentali, i campi proposti corrispondono a quelli presenti nella tabella DOC_ROWS. I campi CUSTOMx di tipo &#8220;text&#8221; vengono considerati campi con possibile formattazione HTML, e in fase di editing viene offerta la possibilit\u00e0 di aprire l&#8217;editor HTML. Per i form collegati a query, non essendo previsto un collegamento con la tabella DOC_ROWS, il sistema propone 60 campi di tipo di testo. I campi considerati di tipo &#8220;text&#8221; sono gli stessi definiti in DOC_ROWS e, quindi, CUSTOM11-CUSTOM15 ed eventuali altri aggiunti.&nbsp;<span style=\"color: #000000; background-color: #ffff00;\"><br \/>\n<\/span><span style=\"background-color: #ffff00; color: #000000;\">2) se una colonna di tipo &#8220;text&#8221; contiene immagini codificate base64, queste vengono visualizzate automaticamente nella cella, con la possibilit\u00e0 di aprirle ingrandite cliccandovi sopra.<\/span><\/li>\n<li><strong><strong><span style=\"color: #993300;\">*DisabilitaPaginazione<\/span><\/strong><\/strong>: se <em>true<\/em> i record non vengono organizzati in pagine. Se NuovoLayout=<em>true<\/em> dalla versione 2025.00.17 la paginazione si attiva in automatico quando i record da visualizzare sono pi\u00f9 di 300. Assegnando a <em>true<\/em> questa propriet\u00e0 si disabilita completamente la paginazione.&nbsp;<\/li>\n<li><span style=\"color: #800000;\"><strong>*NonAggiornareAlCambioRiga<\/strong><\/span>: se <em>true<\/em> la griglia non viene aggiornata quando viene cambiata la riga. Questo migliora le prestazioni.<\/li>\n<li><span style=\"background-color: #ffff00;\"><span style=\"color: #993300;\"><span style=\"color: #993300;\"><strong><span style=\"color: #993300;\"><em>*<\/em>AltezzaRigaMax:<\/span><\/strong><\/span><\/span> determina la massima altezza della riga in pixel. Se NuovoLayout=false viene ignorato.<\/span><\/li>\n<li><span style=\"background-color: #ffff00;\"><span style=\"color: #993300;\"><span style=\"color: #993300;\"><strong><span style=\"color: #993300;\">*ConsentiTrascinamento:<\/span><\/strong><\/span><\/span> assegnare a True per consentire il trascinamento della riga su un altro oggetto Griglia e implementare il Drag\/Drop come spiegato in <a href=\"https:\/\/help.qualiware.it\/qw-help\/esempio-di-drag-and-drop-su-griglia\/\">questo esempio<\/a>, o su un <a href=\"https:\/\/help.qualiware.it\/qw-help\/oggetto-calendario\/\">oggetto Calendario,<\/a>&nbsp;come riportato in <a href=\"https:\/\/help.qualiware.it\/qw-help\/esempio-di-drag-and-drop-su-calendario\/\">questo esempio<\/a>.&nbsp;<\/span><\/li>\n<li><span style=\"background-color: #ffff00;\"> <span style=\"color: #993300;\"><strong>*ConsentiAggiuntaRighe:<\/strong><\/span> assegnare a True per consentire l&#8217;aggiunta di righe<\/span><\/li>\n<li><span style=\"background-color: #ffff00;\"> <span style=\"color: #993300;\"><strong>*ConsentiEliminazioneRighe:<\/strong><\/span> assegnare a True per consentire l&#8217;eliminazione di righe<\/span><\/li>\n<li><span style=\"background-color: #ffff00;\"><span style=\"color: #993300;\"><span style=\"color: #993300;\"><strong><span style=\"color: #993300;\"><em>*<\/em>TestoACapo:<\/span><\/strong><\/span><\/span> Se true, consente l&#8217;andata a capo del testo nell&#8217;intestazione e nelle celle. Se NuovoLayout=false viene ignorato.<\/span><\/li>\n<li><span style=\"background-color: #ffff00;\"><span style=\"color: #993300;\"><strong><span style=\"color: #993300;\"><em>*<\/em>ScrollVirtuale: <\/span><\/strong><span style=\"color: #993300;\"><span style=\"color: #000000;\">a<\/span><\/span><\/span>ssegnare a True per caricare i record dinamicamente in fase di scroll. Valido solo se NuovoLayout=true.<\/span><\/li>\n<li><span style=\"background-color: #ffff00;\"><span style=\"color: #993300;\"><strong><span style=\"color: #993300;\"><em>*<\/em>MostraCasellaRicerca: a<\/span><\/strong><\/span>ssegnare a True per visualizzare la casella di ricerca. Valido solo se NuovoLayout=true<\/span><\/li>\n<li><span style=\"background-color: #ffff00;\"><em><strong><span style=\"color: #990000;\">*<\/span><\/strong><\/em><strong><span style=\"color: #990000;\">PosizioneBottoniModifica<\/span><\/strong>: definisce la posizione dei pulsanti di modifica della riga (in alto, in basso, a destra o a sinistra). Selezionando il valore \u201c<em>None<\/em>\u201d per questa propriet\u00e0 i pulsanti non vengono visualizzati.<br \/>\nNOTA: se i pulsanti vengono posizionati a destra o a sinistra, non sar\u00e0 presente il pulsante per aggiungere la riga.<\/span><\/li>\n<\/ul>\n<h4 align=\"left\"><a name=\"progettazione_form_proprieta\"><\/a>Eventi specifici<\/h4>\n<ul>\n<li><span style=\"color: #800000;\"><strong>EventoCambiaRiga<\/strong><\/span><span style=\"color: #993300;\"><span style=\"color: #800000;\">&nbsp;<\/span><span style=\"color: #000000;\">(sulla griglia)<\/span><\/span><br \/>\nEvento attivato ad ogni cambiamento della riga selezionata da parte dell&#8217;utente. Pu\u00f2 essere utilizzato per intraprendere azioni come ad esempio l&#8217;aggiornamento di altri oggetti del form sulla base dei valori della riga sui cui ci si \u00e8 posizionati.<br \/>\nN.B.<br \/>\n1) questo evento viene eseguito anche quando il cambiamento di riga viene effettuato da programma. E&#8217; possibile evitarlo assegnando la propriet\u00e0 <code>StopExecuteChangeRow<\/code> a <code>True<\/code>.<br \/>\n2) non inserire in questo evento l&#8217;esecuzione lato server di una procedura se \u00e8 stato definito anche l&#8217;EventoSalvaRiga, in quanto il relativo postback non verr\u00e0 eseguito e, di conseguenza, l&#8217;evento stesso non verr\u00e0 eseguito.<\/li>\n<li><span style=\"color: #000000;\"><strong>EventoSalvaRiga<\/strong>&nbsp;(sulla griglia)<\/span><br \/>\n<span style=\"color: #000000;\">Evento attivato ad ogni salvataggio della riga corrente, sia a seguito del cambio della riga, sia a seguito del richiamo del metodo <code>SaveRow()<\/code>. L&#8217;evento viene eseguito prima dell&#8217;effettivo salvataggio, e pu\u00f2 essere utilizzato per verificare la coerenza dei campi. Se l&#8217;evento ritorna il valore <code>True<\/code>, il salvataggio viene eseguito, se ritorna <code>False<\/code> il salvataggio non viene eseguito e l&#8217;eventuale cambio riga non viene effettuato.<\/span><\/li>\n<li><span style=\"background-color: #ffff00;\"><em><span style=\"color: #800000;\"><strong>*<\/strong><\/span><\/em><span style=\"color: #800000;\"><strong>EventoAggiungiRiga<\/strong><\/span><span style=\"color: #993300;\"><span style=\"color: #800000;\">&nbsp;<\/span><span style=\"color: #000000;\">(sulla griglia)<\/span><\/span><\/span><br \/>\n<span style=\"background-color: #ffff00;\">Evento attivato al momento dell&#8217;aggiunta di una riga. Pu\u00f2 essere usato per impedire l&#8217;aggiunta, ritornando il valore &#8220;False&#8221;. Utilizzabile &nbsp;se <em>NuovoLayout=tru<\/em>e.<\/span><\/li>\n<li><span style=\"background-color: #ffff00;\"><span style=\"color: #800000;\"><strong>*EventoEliminaRiga<\/strong><\/span><span style=\"color: #993300;\"><span style=\"color: #800000;\">&nbsp;<\/span><span style=\"color: #000000;\">(sulla griglia)<\/span><\/span><\/span><br \/>\n<span style=\"background-color: #ffff00;\">Evento attivato al momento dell&#8217;eliminazione di una riga. Pu\u00f2 essere usato per impedire l&#8217;aggiunta, ritornando il valore &#8220;False&#8221;. Utilizzabile &nbsp;se <em>NuovoLayout=true<\/em>.<\/span><\/li>\n<li><span style=\"color: #800000;\"><strong>EventoCambia&nbsp;<\/strong><\/span><span style=\"color: #993300;\"><span style=\"color: #000000;\">(sulle colonne)<\/span><\/span><br \/>\nevento attivato al cambiamento del valore di una cella appartenente alla colonna cui l&#8217;evento \u00e8 collegato. Pu\u00f2 essere utilizzato per<br \/>\n&#8211; assegnare altri campi in base al valore inserito nella cella<br \/>\n&#8211; verificare la validit\u00e0 del valore inserito dando eventualmente un messaggio all&#8217;utente.<br \/>\n&#8211; in versione client, per invalidare il valore inserito ritornando il valore &#8220;false&#8221;. <span style=\"background-color: #ffff00;\">Se <em>NuovoLayout=&#8221;true&#8221;<\/em> \u00e8 anche possibile ritornare il testo che dovr\u00e0 essere visualizzato in caso di valore non valido.<\/span><br \/>\nDi seguito un esempio di codice <strong>client<\/strong> che consente di invalidare il valore e di modificare il colore della cella:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">if ($('#&lt;Grid1&gt;').readField(\"NUMBER1\")&lt;2) {\r\n  $.QualiWare.alert(\"Il numero deve essere maggiore o uguale a 2\",\"ATTENZIONE\");\r\n  return false\r\n}\r\n\r\nif ($('#&lt;Grid1&gt;').readField(\"NUMBER1\")&gt;=10) {\r\n  $('#&lt;Grid1&gt;').assignField(\"FLAG1\",true)\r\n  $('#&lt;Grid1&gt;').getCurrentRowCell(\"NUMBER1\").css(\"background-color\",\"red\")\t\r\n}<\/pre>\n<\/li>\n<li><strong><span style=\"color: #993300;\">EventoDatiCaricatiClient<\/span><\/strong><span style=\"color: #993300;\">&nbsp;<span style=\"color: #000000;\">(sulla griglia)<br \/>\n<\/span><\/span>Evento attivato lato client solo se NuovoLayout=true al termine di ogni caricamento asincrono dei dati. Pu\u00f2 essere usato per modificare gli stili delle celle.<\/li>\n<li><span style=\"color: #800000;\"><strong>*EventoEditCellaClient <\/strong><\/span><span style=\"color: #993300;\"><span style=\"color: #000000;\">(sulle colonne)<\/span><\/span><br \/>\nevento attivato <strong>lato client<\/strong> nel momento in cui l&#8217;utente tenta di entrare in una cella per modificarne il valore. Pu\u00f2 essere utilizzato per disabilitare la modifica senza la necessit\u00e0 di un&#8217;interazione con il server. L&#8217;evento, scritto in linguaggio Javascript, deve ritornare il valore &#8220;false&#8221; se la modifica deve essere inibita. Altrimenti pu\u00f2 ritornare il valore &#8220;true&#8221; o nessun valore. Di seguito un esempio di utilizzo:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">if ($('#&lt;Grid1&gt;').readField(\"CUSTOM1\")==2)\r\n  return false<\/pre>\n<\/li>\n<li><span style=\"background-color: #ffff00;\"><strong><span style=\"color: #993300;\">*EventoRenderCellaClient<\/span><\/strong><span style=\"color: #993300;\"><span style=\"color: #993300;\">&nbsp;<span style=\"color: #000000;\">(<\/span><\/span><\/span><span style=\"color: #993300;\"><span style=\"color: #000000;\">sulla griglia)<\/span><\/span><span style=\"color: #993300;\"><span style=\"color: #000000;\"><br \/>\n<\/span><\/span>Evento attivato lato client solo se NuovoLayout=true al momento di effettuare il render di ogni cella. Pu\u00f2 essere usato per modificare i valori visualizzati, inserendo, ad esempio, delle icone, come riportato nell&#8217;esempio riportato di seguito. Nel codice \u00e8 possibile usare la variabile &#8220;field&#8221;, che contiene il nome della campo, la variabile &#8220;value&#8221; contiene il valore della cella, e la variabile &#8220;row&#8221;, che contiene il valore di tutti i campi della griglia. L&#8217;evento deve ritornare il valore da visualizzare, che pu\u00f2 contenere codice HTML.<\/span><br \/>\n<span style=\"background-color: #ffff00;\">Di seguito un esempio di utilizzo, che visualizza sulla colonna associata al campo NUMBER1 una freccia verde verso l&#8217;alto se il valore \u00e8 maggiore di 10, una freccia rossa verso il basso altrimenti.<\/span><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">if (field=='NUMBER1')\r\n    if (value&gt;10)\r\n        return value.toString()+' &lt;span class=\"mdi mdi-arrow-up-bold\" style=\"color:green\"&gt;&lt;\/span&gt;'\r\n    else\r\n        return value.toString()+' &lt;span class=\"mdi mdi-arrow-down-bold\" style=\"color:red\"&gt;&lt;\/span&gt;'<\/pre>\n<\/li>\n<\/ul>\n<p>Per maggiori informazioni sugli eventi leggi <a href=\"http:\/\/help.qualiware.it\/qw-help\/fd-eventi\/\">qui<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<h4 align=\"left\"><a name=\"progettazione_form_proprieta\"><\/a>Propriet\u00e0 utilizzabili da codice lato Server (VB.NET\/C#)<\/h4>\n<div class=\"msgBody\">\n<ul>\n<li><code>Enabled As Boolean<\/code> &#8211; se viene settato a <code>False<\/code>, disabilita la modifica dei valori nelle celle della griglia.<\/li>\n<li><code>*NewRow As Boolean<\/code> &#8211; propriet\u00e0 a sola lettura che ritorna <code>True<\/code> se la riga corrente \u00e8 nuova e non \u00e8 quindi stata salvata nemmeno una volta.<\/li>\n<li><code>*StopExecuteChangeRow As Boolean<\/code> &#8211; se viene assegnato a <code>True<\/code>, non viene eseguito l&#8217;<span style=\"color: #800000;\"><strong>EventoCambiaRiga<\/strong><\/span>.<\/li>\n<li><code><span style=\"background-color: #ffff00;\">*AllowAddRows As Boolean<\/span><\/code><span style=\"background-color: #ffff00;\"> &#8211; se viene assegnato a <code>False<\/code>, viene inibita la possibilit\u00e0 di aggiungere righe<\/span><\/li>\n<li><span style=\"background-color: #ffff00;\"> <code>*AllowDeleteRows As Boolean<\/code> &#8211; se viene assegnato a <code>False<\/code>, viene inibita la possibilit\u00e0 di cancellare righe<\/span><\/li>\n<\/ul>\n<\/div>\n<h4 align=\"left\"><a name=\"progettazione_form_proprieta\"><\/a>Metodi utilizzabili da codice lato Server (VB.NET\/C#)<\/h4>\n<p>Nel codice degli eventi \u00e8 possibile utilizzare i seguenti metodi:<\/p>\n<ul>\n<li><code>AddRow() As Boolean<\/code> &#8211; aggiunge una riga vuota e spostare il cursore sulla riga aggiunta che diventa la riga corrente (solo versione web)<\/li>\n<li><code>AddRow(Optional ByVal ShowEdit As Boolean = False) As Boolean<\/code> &#8211; aggiunge una riga vuota e se il parametro \u00e8 <code>True<\/code> mostra la scheda di editing dei valori della riga (solo versione mobile)<\/li>\n<li><code>AssignField(ByVal field As String, ByVal value As String) As String<\/code> &#8211; assegna al campo specificato nel primo parametro il valore specificato nel secondo, per la riga corrente<\/li>\n<li><code>AssignField(ByVal field_set As AssocArray) As String<\/code> &#8211; prende come input un AssocArray che ha come chiavi i nomi dei campi e come valori delle stringhe. Assegna ogni stringa come valore di ciascun campo esistente, per la riga corrente.<\/li>\n<li><code>Count() As Integer<\/code> &#8211; restituisce il numero totale delle righe caricabili nella griglia<\/li>\n<li><code>DeleteAllRows() As Boolean<\/code> &#8211; cancella tutte le righe attualmente mostrate dalla griglia<\/li>\n<li><code>DeleteRow() As Boolean<\/code> &#8211; cancella la riga corrente<\/li>\n<li><code>EndOfRows() As Boolean<\/code> &#8211; restituisce <code>True<\/code> se il puntatore della riga corrente \u00e8 oltre l&#8217;ultima riga<\/li>\n<li><code>FilterRows(ByVal condition As String) As Boolean<\/code> &#8211; filtra le righe della griglia in base alla condizione SQL passata come argomento. Per annullare tutti i filtri presenti basta passare una stringa vuota. <strong>NOTA<\/strong>: per la versione client\/server non \u00e8 possibile utilizzare l&#8217;operatore <code>like<\/code> (**)<\/li>\n<li><code>*GetCellValue(Byval Row As Integer, Byval field As String<\/code>&nbsp;&#8211; restituisce il valore contenuto nella cella corrispondente alla colonna collegata al campo <code>field<\/code> nella riga <code>Row<\/code><\/li>\n<li><code>GoToRow(ByVal bookmark As Object) As Boolean<\/code> &#8211; muove il cursore sulla riga corrispondente al segnalibro specificato<\/li>\n<li><code>LocateRow(ByVal condition As String) As Boolean<\/code> &#8211; muove il cursore sulla prima riga della griglia che soddisfa la condizione SQL passata (**). Restituisce un valore booleano che indica se \u00e8 stata trovata una riga. <strong>NOTA:<\/strong> la ricerca parte dalla riga selezionata al momento. Pu\u00f2 quindi essere necessario chiamare prima <code>MoveFirst()<\/code> per ottenere i risultati desiderati.<\/li>\n<li><code>MoveFirst() As Boolean<\/code> &#8211; sposta il puntatore delle righe sulla prima riga tra quelle mostrate, ritornando <code>False<\/code> se l&#8217;operazione non \u00e8 riuscita, ad esempio perch\u00e8 non vi sono righe<\/li>\n<li><code>MoveLast() As Boolean<\/code> &#8211; sposta il puntatore delle righe sull&#8217;ultima riga tra quelle mostrate, ritornando <code>False<\/code> se l&#8217;operazione non \u00e8 riuscita, ad esempio perch\u00e8 non vi sono righe<\/li>\n<li><code>MoveNext() As Boolean<\/code> &#8211; sposta il puntatore delle righe sulla riga successiva a quella corrente, ritornando <code>False<\/code> se si era sull&#8217;ultima riga e il puntatore \u00e8 andato oltre la fine dell&#8217;insieme di righe<\/li>\n<li><code>MovePrevious() As Boolean<\/code> &#8211; sposta il puntatore delle righe sulla riga precedente a quella corrente, ritornando <code>False<\/code> se si era sulla prima riga e il puntatore \u00e8 andato prima dell&#8217;inizio dell&#8217;insieme di righe<\/li>\n<li><code>ReadField(ByVal field As String) As Object<\/code> &#8211; restituisce il valore del&nbsp;campo specificato nel parametro, per la riga corrente<\/li>\n<li><code>Refresh()<\/code> &#8211; aggiorna la visualizzazione della griglia<\/li>\n<li><code>RowBookmark() As Object<\/code> &#8211; restituisce un oggetto che rappresenta il segnalibro della riga corrente, ed \u00e8 possibile utilizzarlo per riposizionarsi successivamente sulla riga<\/li>\n<li><code>RowCount()<\/code>&#8211; restituisce il numero totale delle righe caricate nella griglia. A differenza del metodo Count(), nel caso di griglie paginate restituisce il solo numero delle griglie visualizzate.<\/li>\n<li><code>*SetColumnReadOnly(ByVal columnname As String, ByVal readonly As Boolean)<\/code> &#8211; rende a sola lettura la colonna corrispondente al campo <code>columnname<\/code> se <code>readonly = True<\/code>, la rende editabile se <code>readonly = False<\/code>.<\/li>\n<li><code>SetColumnWidth(ByVal columnname As String, ByVal width As Integer)<\/code> &#8211; definisce la larghezza della colonna corrispondente al campo <code>columnname<\/code>. Se <code>width = 0<\/code>, la colonna viene nascosta.<\/li>\n<li><code>*SetColumnHeaderText(ByVal columnname As String, ByVal text As String)<\/code> &#8211; definisce il testo dell&#8217;intestazione della colonna corrispondente al campo <code>columnname<\/code>.<\/li>\n<li><code>*SetColumnHidden(ByVal columnname As String, ByVal hidden As Boolean)<\/code> &#8211; definisce se la colonna corrispondente al campo <code>columnname<\/code>\u00e8 nascosta (parametro hidden=true) o meno (parametro hidden=false).<\/li>\n<li><code>SetColumnItems(ByVal field As String, ByVal items As dbArray)<\/code> &#8211; assegna alla casella a discesa corrispondente al campo specificato nel primo parametro gli elementi specificati nel secondo parametro. Perch\u00e9 il metodo funzioni, \u00e8 necessario che la colonna in questione abbia una query fittizia nell&#8217;apposita propriet\u00e0 che termini con <code>as DROPDOWN_VALUE<\/code>. In seguito alla chiamata di questo metodo, \u00e8 poi necessario fare un refresh della griglia tramite <code>Refresh()<\/code>.<br \/>\n<span style=\"color: #000000; background-color: #ffff00;\">NOTA: se<em> NuovoLayout=true<\/em>, ogni elemento pu\u00f2 essere una stringa o un oggetto DBArray di due elementi, il primo essendo il codice che verr\u00e0 memorizzato nella colonna, e il secondo il testo che verr\u00e0 mostrato nella tendina. <\/span><\/li>\n<li><code>*SetFocusOnColumn(ByVal columnname As String)<\/code> &#8211; rende attiva la cella corrispondente al campo <code>columnname<\/code> della riga corrente, entrando in modalit\u00e0 di modifica.<\/li>\n<li><code>SaveRow() As Boolean<\/code> &#8211; salva la riga corrente, restituendo <code>True<\/code> se l&#8217;operazione \u00e8 andata a buon fine<\/li>\n<li><code>*SetCellStyle(Byval Row As Integer, Byval field As String, Byval Style As String)<\/code>&nbsp;&#8211; assegna lo style specificato nel parametro &lt;style&gt;, precedentemente definito con il metodo AddStyle del form, alla cella corrispondente alla colonna collegata al campo &lt;field&gt; nella riga &lt;Row&gt;. <span style=\"background-color: #ffff00;\">Se <em>NuovoLayout=true<\/em>, nel parametro &lt;style&gt; \u00e8 possibile specificare la definizione dello style, senza la necessit\u00e0 di una definizione con AddStyle.<\/span><\/li>\n<li><code>*SetHeaderStyle(Byval Style As String)<\/code>: assegna lo style specificato nel parametro &lt;style&gt;, precedentemente definito con il metodo AddStyle del form, all&#8217;intestazione della griglia. <span style=\"background-color: #ffff00;\">Se <em>NuovoLayout=true<\/em>, nel parametro &lt;style&gt; \u00e8 possibile specificare la definizione dello style, senza la necessit\u00e0 di una definizione con AddStyle.<\/span><\/li>\n<li><code>*SetHeaderStyle(Byval field As String, Byval Style As String)<\/code>: assegna lo style specificato nel parametro &lt;style&gt;, precedentemente definito con il metodo AddStyle del form, all&#8217;intestazione della colonna corrispondente al campo &lt;field&gt;. <span style=\"background-color: #ffff00;\">Se <em>NuovoLayout=true<\/em>, nel parametro &lt;style&gt; \u00e8 possibile specificare la definizione dello style, senza la necessit\u00e0 di una definizione con AddStyle.<\/span><\/li>\n<li><code>setReadOnly(ByVal bool As Boolean)<\/code> &#8211; se richiamato passando il valore <code>True<\/code> al parametro porta la griglia in modalit\u00e0 sola lettura, se si passa <code>False<\/code> la porta in modalit\u00e0 lettura\/scrittura<\/li>\n<li><code>*SetRowStyle(Byval Row As Integer, Byval Style As String)<\/code>: assegna lo style specificato nel parametro &lt;style&gt;, precedentemente definito con il metodo AddStyle del form, alla riga &lt;Row&gt;. <span style=\"background-color: #ffff00;\">Se <em>NuovoLayout=tru<\/em>e, nel parametro &lt;style&gt; \u00e8 possibile specificare la definizione dello style, senza la necessit\u00e0 di una definizione con AddStyle.<\/span><\/li>\n<li><span style=\"background-color: #ffff00;\"><code>*SetSelectedRowStyle(Byval Style As String)<\/code>: se <em>NuovoLayout=true<\/em>, assegna lo style definito nel parametro &lt;style&gt; alla riga selezionata. <\/span><\/li>\n<li><code>*setVisible(ByVal bool As Boolean)<\/code> se richiamato passando il valore <code>False<\/code> nasconde la griglia, se si passa <code>True<\/code> la visualizza<\/li>\n<li><code>*sort(ByVal columns As string)<\/code> ordina la griglia in base ai datalink indicati come argomento. I nomi delle colonne vanno separati da un comma e da uno spazio e possono essere seguiti dalla stringa &#8220;<code>DESC<\/code>&#8221; (obbligatoriamente in uppercase) nel caso in cui l&#8217;ordinamento debba essere discendente. Esempio di chiamata:&nbsp;<code>form.FindControl(\"Grid1\").sort(\"NUMBER1, DATE1 DESC\")<\/code><\/li>\n<li><span style=\"background-color: #ffff00;\"><code>*ExpandChildGrid()<\/code>&#8211; espande le righe mostrando la griglia figlia collegata a ciascuna.<\/span><\/li>\n<li><span style=\"background-color: #ffff00;\"><code>*CollapseChildGrid()<\/code>&#8211; chiude le righe nascondendo la griglia figlia collegata a ciascuna.<\/span><\/li>\n<\/ul>\n<p>(**) \u00c8 necessario ovviamente trasformare i numeri e le date in stringa, come nel seguente esempio:<\/p>\n<p><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">Dim condizione As String = \"NUMBER1=\" &amp; CStr(N1) &amp; \" and NUMBER2=\" &amp; CStr(N2) &amp; \" and DATE1=#\" &amp; dtoc(D1,\"yyyy\/MM\/dd\") &amp; \"#\"<\/code><\/p>\n<p>&nbsp;<\/p>\n<h4 align=\"left\"><a name=\"eventi_form\"><\/a>Metodi utilizzabili da codice lato Client (Javascript)<\/h4>\n<ul>\n<li><code>show()<\/code> &#8211; mostra l&#8217;oggetto.<\/li>\n<li><code>hide()<\/code> &#8211; nasconde l&#8217;oggetto.<\/li>\n<li><code>assignField(field,value)<\/code>&#8211; assegna il valore <code>value<\/code>al campo <code>field<\/code> della riga correntemente selezionata. NOTA: se questo metodo viene usato da un pulsante, \u00e8 necessario posizionare, prima del richiamo, il fuoco sulla colonna che verr\u00e0 modificata, con il metodo setFocusOnColumn (vedere di seguito), per forzare l&#8217;attivazione della modalit\u00e0 editing. Diversamente, il valore assegnato non verr\u00e0 memorizzato se l&#8217;utente non entrer\u00e0 in editing della riga.<\/li>\n<li><code>readField(field)<\/code>&#8211; restituisce il valore del campo <code>field<\/code> della riga correntemente selezionata.<\/li>\n<li><span style=\"background-color: #ffff00;\"><code>*expandChildGrid()<\/code>&#8211; espande le righe mostrando la griglia figlia collegata a ciascuna.<\/span><\/li>\n<li><span style=\"background-color: #ffff00;\"><code>*collapseChildGrid()<\/code>&#8211; chiude le righe nascondendo la griglia figlia collegata a ciascuna.<\/span><\/li>\n<li><code>getCell(row,field)<\/code> &#8211; restituisce l&#8217;oggetto jQuery della cella corrispondente alla riga <code>row<\/code> e alla colonna <code>field<\/code>. Sull&#8217;oggetto restituito \u00e8 possibile usare qualsiasi metodo jQuery, come ad esempio <code>css<\/code>,<code>addClass<\/code> e <code>removeClass<\/code>. Ad esempio, pu\u00f2 essere usato per assegnare le propriet\u00e0 dello stile:<br \/>\n<code class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">$('#&lt;Grid1&gt;').getCell(row,\"NUMBER1\").css(\"background-color\",\"red\")<\/code><\/li>\n<li><code>getCellValue(row, field)<\/code> &#8211; restituisce il valore&nbsp;della cella corrispondente alla riga <code>row<\/code> e alla colonna <code>field<\/code>.<\/li>\n<li><code>*getCurrentRowCell(field)<\/code> &#8211; restituisce l&#8217;oggetto jQuery della cella corrispondente alla riga corrente e alla colonna <code>field<\/code>. Sull&#8217;oggetto restituito \u00e8 possibile usare qualsiasi metodo jQuery, come ad esempio <code>css<\/code>,<code>addClass<\/code> e <code>removeClass<\/code> (vedere metodo <code>getCell<\/code>).<\/li>\n<li><span style=\"background-color: #ffff00;\"><code>*grid()<\/code> &#8211; restituisce l&#8217;oggetto griglia<\/span>.<\/li>\n<li><code>rowCount()<\/code> &#8211; restituisce il numero di righe visualizzate.<\/li>\n<li><code>*setCellValue(row, field, value)<\/code> &#8211; assegna il valore <code>value<\/code> alla cella corrispondente alla riga <code>row<\/code> e alla colonna <code>field<\/code>.<\/li>\n<li><code>setColumnWidth(field,width)<\/code> &#8211; definisce la larghezza della colonna corrispondente al campo <code>field<\/code>. Se <code>width = 0<\/code>, la colonna viene nascosta.<\/li>\n<li><code>setColumnHeaderText(field,text)<\/code> &#8211; definisce il testo dell&#8217;intestazione della colonna corrispondente al campo <code>field<\/code>.<\/li>\n<li><code>setColumnHidden(field,hidden)<\/code> &#8211; definisce se la colonna corrispondente al campo <code>field<\/code>nascosta (parametro hidden=true) o meno (parametro hidden=false).<\/li>\n<li><code>*setFocusOnColumn(field,hidden)<\/code> &#8211; solo se NuovoLayout=true, rende attiva la cella corrispondente al campo <code>field<\/code> della riga corrente, entrando in modalit\u00e0 di modifica.<\/li>\n<li><code>*moveFirst()<\/code>&nbsp;<span style=\"background-color: #ffff00;\">&#8211; sposta il puntatore delle righe sulla prima riga tra quelle mostrate, ritornando <code>False<\/code> se l&#8217;operazione non \u00e8 riuscita, ad esempio perch\u00e8 non vi sono righe<\/span><\/li>\n<li><code>*moveLast()<\/code>&nbsp;<span style=\"background-color: #ffff00;\">&#8211; sposta il puntatore delle righe sull&#8217;ultima riga tra quelle mostrate, ritornando <code>False<\/code> se l&#8217;operazione non \u00e8 riuscita, ad esempio perch\u00e8 non vi sono righe<\/span><\/li>\n<li><code>*moveNext()<\/code>&nbsp;<span style=\"background-color: #ffff00;\">&#8211; sposta il puntatore delle righe sulla riga successiva a quella corrente, ritornando <code>False<\/code> se si era sull&#8217;ultima riga e il puntatore \u00e8 andato oltre la fine dell&#8217;insieme di righe<\/span><\/li>\n<li><code>*movePrevious()<\/code>&nbsp;<span style=\"background-color: #ffff00;\">&#8211; sposta il puntatore delle righe sulla riga precedente a quella corrente, ritornando <code>False<\/code> se si era sulla prima riga e il puntatore \u00e8 andato prima dell&#8217;inizio dell&#8217;insieme di righe<\/span><\/li>\n<li><code>*endOfRows()<\/code>&nbsp;<span style=\"background-color: #ffff00;\">&#8211; restituisce <code>True<\/code> se il puntatore della riga corrente \u00e8 oltre l&#8217;ultima riga<\/span><\/li>\n<li><code>*filterData(filter)<\/code>&nbsp;<span style=\"background-color: #ffff00;\">&#8211; filtra le righe contenenti la stringa specificata nel parametro filter<\/span><\/li>\n<li><code>*rowBookmark()<\/code>&nbsp;<span style=\"background-color: #ffff00;\">&#8211; restituisce un numero che rappresenta il segnalibro della riga corrente, ed \u00e8 possibile utilizzarlo per riposizionarsi successivamente sulla riga<\/span><\/li>\n<li><code>*goToRow(bookmark)<\/code>&nbsp;<span style=\"background-color: #ffff00;\">&#8211; muove il cursore sulla riga corrispondente al segnalibro specificato<\/span><\/li>\n<\/ul>\n<h4 align=\"left\"><a name=\"migrazione\"><\/a>Migrazione a nuovo layout<\/h4>\n<p>Sui form esistenti \u00e8 possibile utilizzare il nuovo layout dell&#8217;oggetto Griglia, assegnando la propriet\u00e0 NuovoLayout a <em>true<\/em> ed effettuando le verifiche elencate nel seguito e le modifiche eventualmente conseguenti.<\/p>\n<ul>\n<li>Nei selettori utilizzati nelle funzioni jQuery &#8220;$&#8221;,&#8221;find&#8221;, e nel primo parametro della funzione &#8220;attr&#8221;, sostituire l&#8217;attributo &#8220;idx&#8221; con &#8220;data-rowindex&#8221;. Dove viene ricercato l&#8217;attributo &#8220;data-rowindex&#8221;, il valore deve essere messo fra apici.<\/li>\n<li>Nei selettori utilizzati nelle funzioni jQuery &#8220;$&#8221; e &#8220;find&#8221; sostiture la classe &#8220;.igg_ActiveRow&#8221; con &#8220;.e-row&#8221;<\/li>\n<li>Le istruzioni che aggiornano i colori di righe e celle via Javascript vanno spostate dall&#8217;evento &#8220;RenderClient&#8221; del form all&#8217;evento &#8220;DatiCaricatiClient&#8221; della griglia, che si attiva al termine del caricamento asincrono dal server.<\/li>\n<li>Se la propriet\u00e0 &#8220;ScrollVirtuale&#8221; \u00e8 <em>true<\/em>, va tenuto presente che le righe caricate in ogni momento sono solo una parte di quelle presenti nel database. In questo caso \u00e8 necessario evitare di effettuare operazioni come totali o ricerca di dati maggiori o minori via javascript, in quanto la probabilit\u00e0 di non considerare tutte le righe \u00e8 molto alta.<\/li>\n<li>Per cercare la riga corrente in corso di editing, usare il selettore &#8220;.e-editedrow[role=&#8217;row&#8217;]&#8221;<\/li>\n<li>I pulsanti che interagiscono con la griglia, ad esempio per aggiungere, inserire, eliminare o aggiornare righe, \u00e8 bene siano spostati all&#8217;interno di un oggetto <a href=\"https:\/\/help.qualiware.it\/qw-help\/fd-contenitore\/\" target=\"_blank\" rel=\"noopener\">Contenitore<\/a> con la propriet\u00e0 &#8220;ContenitoreAggiornamento&#8221; a <em>true<\/em>. In questo modo, gli aggiornamenti delle righe non comportano il refresh grafico dell&#8217;intera griglia.<\/li>\n<li>Allo stesso modo, eventuali oggetti esterni alla griglia il cui valore viene aggiornato nell&#8217;evento &#8220;CambiaRiga&#8221; lato server, devono essere inseriti in un oggetto <a href=\"https:\/\/help.qualiware.it\/qw-help\/fd-contenitore\/\" target=\"_blank\" rel=\"noopener\">Contenitore<\/a> con la propriet\u00e0 &#8220;ContenitoreAggiornamento&#8221; a <em>true<\/em>, prevedendo, nell&#8217;evento stesso, l&#8217;aggiornamento del contenitore tramite il metodo &#8220;UpdateContainer&#8221; del form.<\/li>\n<li>Se si ha la necessit\u00e0 di attivare da codice l&#8217;editing di una riga, \u00e8 sufficiente richiamare il metodo &#8220;SetFocusOnColumn&#8221; specificando la colonna sulla quale si vuole posizionare il cursore.<\/li>\n<li>Se vi sono liste a discesa che presentano, nella propriet\u00e0 &#8220;QueryLista&#8221;, parametri che fanno riferimento ad altri oggetti del form, questi ultimi non devono essere nascosti n\u00e8 assegnando &#8220;visible=false&#8221; in uno script lato Server, n\u00e8 tramite la propriet\u00e0 &#8220;RuoliVisualizzatori&#8221;. Se li si vuole nascondere. \u00e8 necessario farlo assegnando lo style(&#8220;VISIBILITY&#8221;)=&#8221;hidden&#8221;.\n<p id=\"the-pasted-async\">&nbsp;<\/p>\n<p id=\"the-pasted-async\">&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Descrizione L&#8217;oggetto Griglia consente la visualizzazione di informazioni sotto forma di tabella modificabile. Dalla release release 2023.02.00 dalla \u00e8 disponibile una nuova versione, attivabile assegnando la propriet\u00e0 NuovoLayout=true. Le funzionalit\u00e0 aggiunte o modificate sono evidenziate in colore giallo. Nel paragrafo Migrazione sono riportate alcune indicazioni utili ad agevolare la migrazione delle griglie esistenti al nuovo&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"ngg_post_thumbnail":0,"footnotes":""},"categories":[6],"tags":[],"acf":[],"_links":{"self":[{"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/posts\/22671"}],"collection":[{"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/comments?post=22671"}],"version-history":[{"count":59,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/posts\/22671\/revisions"}],"predecessor-version":[{"id":38318,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/posts\/22671\/revisions\/38318"}],"wp:attachment":[{"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/media?parent=22671"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/categories?post=22671"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/tags?post=22671"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}