Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di Vinsent
    Registrato dal
    May 2011
    Messaggi
    314

    [VB2010 WinForm] Importare impostazioni da User.Config

    Ciao a tutti, è la prima che volta che scrivo qui, spero che sia la sezione giusta.
    Per diletto ho fatto un programma per stampare etichette su stampanti zebra nel quale salvo il codice zpl (zebra programming language) come impostazione utilizzando my.settings.
    Quando creo una nuova versione del programma, o semplicemente rinomino l' exe, l' impostazione va persa, per ovviare ho aggiunto un' opzione per impostare lo zpl con un codice predefinito solo che può capitare che l' etichetta non sia allineata o per necessità non sia uguale a quella della versione precedente, ad ogni "release" dovrei riscrivere il codice zpl e le varie impostazioni inserite nel programma solo che sono arrivato a più di 90 impostazioni...quindi mi è venuta l' idea di inserire un' opzione per leggere le impostazioni dal file app.config della vecchia versione e salvarle con my.settings nella nuova, solo che non riesco a farlo.
    In pratica con un file app.config vecchia versione come questo:
    codice:
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <configSections>
            <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
                <section name="Etichette_9.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
            </sectionGroup>
        </configSections>
        <userSettings>
            <Etichette_9.My.MySettings>
                          </setting>
                <setting name="ZPL_entrate" serializeAs="String">
                    <value>^XA
    ^LH0,0
    ^FO240,0^A0N,17,17^FD9data9^FS
    ^FO5,0^A0N,17,17^FH\^FD9documento9^FS
    ^FO5,22^A0N,40,45^FH\^FD9codice9^FS
    9barcode_codice9
    ^PQ9n_etichette9
    ^XZ</value>
                </setting>
            </Etichette_9.My.MySettings>
        </userSettings>
    </configuration>
    vorrei, con la nuova versione del programma, verificare se il "setting name" ZPL_entrate esiste e se "true" copiare il Value in una dim per poi salvare il testo nelle impostazioni del programma.
    Da tutte le ricerche che ho fatto non ne sono venuto a capo.
    Qualcuno riesce ad aiutarmi?

    PS: dopo millemila ricerche e prove sono riuscito a ottenere il path dell' app.config del programma per farne un backup tramite codice, se può servire bisogna aggiungere il riferimento System.confurigation e importarlo, il codice è:
    codice:
    Dim appconfig_path As Configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal)
    Dim appconfig_path_str As String = appconfig_path.FilePath

  2. #2
    Utente di HTML.it L'avatar di Vinsent
    Registrato dal
    May 2011
    Messaggi
    314
    Risolto!!!
    Avevo la soluzione sotto gli occhi ma la birra mi impediva la vista...
    Prima di tutto il file in questione non era app.config ma user.config
    Dagli esempi/soluzioni che avevo trovato in rete non capivo cosa leggere e come dal file xml.
    Dopo una breve studiatina sulla formattazione degli xml ho avuto l' illuminazione.
    Con un file come quello che segue che ho utilizzato come test:
    codice:
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <configSections>
            <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
                <section name="test.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
            </sectionGroup>
        </configSections>
        <userSettings>
            <test.My.MySettings>
                <setting name="setting1_nome" serializeAs="String">
                    <value>setting1_valore</value>
                </setting>
                <setting name="setting2_nome" serializeAs="String">
                    <value>setting2_valore</value>
                </setting>
                <setting name="setting3_nome" serializeAs="String">
                    <value>setting3_valore</value>
                </setting>
            </test.My.MySettings>
        </userSettings>
    </configuration>
    i nodi vanno letti come delle directory di un File System tipo:
    /configuration/configSections/sectionGroup o /configuration/userSettings/test.My.MySettings
    dove ogni nodo a dei sottonodi con delle proprietà.
    Penso di aver spiegato malissimo il concetto...di seguito il codice che ho utilizzato con un file user.config come quello sopra in cui prima ottengo il nome del programma che lo ha generato e da questo verifico e salvo le impostazioni che mi servono.
    Premessa:
    l' ambiente di sviluppo è Microsoft Visual Basic 2010 Express
    il file user.config deve seguire quella formattazione perchè il codice include percorsi assoluti
    ci sono da gestire tutte le eccezioni del caso come valori "null" o impostazioni che variano
    per esempio da "string" a "decimal"
    codice:
      Dim user_config_file As New Xml.XmlDocument
    
            ' file è il file user.config aperto con una openfiledialog
            user_config_file.Load(file)
    
            ' indico il percorso del nodo da leggere per ottenere il nome del programma che ha generato
            ' il file user.config
            Dim nome_programma_nodo As Xml.XmlNode = user_config_file.SelectSingleNode("/configuration/configSections/sectionGroup")
    
            ' variabile che conterrà il nome del programma
            Dim nome_programma_nodo_testo As String
    
            ' ottengo il nome del programma 
            For a = 0 To nome_programma_nodo.ChildNodes.Count - 1 Step 1
                nome_programma_nodo_testo = nome_programma_nodo.ChildNodes(a).Attributes("name").Value
            Next
    
            ' indico il percorso "user setting" più il nome del programma
            Dim node As Xml.XmlNode = user_config_file.SelectSingleNode("/configuration/userSettings/" & nome_programma_nodo_testo)
    
            ' variabile che conterrà il nome dell' impostazione
            Dim nome_impostazione As String
    
            ' variabile che conterrà il valore dell' impostazione
            Dim valore_impostazione As String
    
            ' leggo il nome del nodo ed il valore
            For b = 0 To node.ChildNodes.Count - 1 Step 1
                nome_impostazione = node.ChildNodes(b).Attributes("name").Value
                valore_impostazione = node.ChildNodes(b).InnerText
    
                ' se il nome del nodo è uguale salvo il valore
                If nome_impostazione = "setting1_nome" Then
                    My.Settings.setting1 = valore_impostazione
                End If
                If nome_impostazione = "setting2_nome" Then
                    My.Settings.setting2 = valore_impostazione
                End If
                If nome_impostazione = "setting3_nome" Then
                    My.Settings.setting3 = valore_impostazione
                End If
    
            Next
    Eventuali pareri/consigli/critiche sono ben accetti.
    Ciao e scusate la lunghezza del post.

    Vincenzo

  3. #3
    Utente di HTML.it L'avatar di Vinsent
    Registrato dal
    May 2011
    Messaggi
    314
    Ho un' altro "prurito"...
    Vorrei evitare di scrivere tutta la parte:
    codice:
               ' se il nome del nodo è uguale salvo il valore
                If nome_impostazione = "setting1_nome" Then
                    My.Settings.setting1 = valore_impostazione
                End If
                If nome_impostazione = "setting2_nome" Then
                    My.Settings.setting2 = valore_impostazione
                End If
                If nome_impostazione = "setting3_nome" Then
                    My.Settings.setting3 = valore_impostazione
                End If
    dove vado a verificare l' esistenza delle impostazioni del nuovo programma con quelle del vecchio.
    Ad ogni aggiunta/modifica delle impostazioni devo verificare se ho cannato qualcosa.
    Quindi vorrei sostituire il codice con altro ciclo dove leggo le impostazioni della nuova versione del programma. Avevo pensato di leggere l' user.config della nuova versione ma se prima non salvo l' impostazione non la trovo nel file.
    Qualche idea?
    Grazie

    Vincenzo

  4. #4
    Utente di HTML.it L'avatar di Vinsent
    Registrato dal
    May 2011
    Messaggi
    314
    Risolto!!!
    codice:
     
           Dim nome_imp_attuale As String
            For Each setting As System.Configuration.SettingsProperty In My.Settings.Properties
                nome_imp_attuale = setting.Name
                If nome_imp_attuale = nome_imp_vecchia Then
                    My.Settings.Item(nome_imp_attuale) = valore_impostazione
                End If
            Next

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.