Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    95

    [C#] Salvare le proprietà di una TextBox

    Ciao a tutti!
    Vorrei salvare su un file tutte le proprietà di una TextBox (carattere, dimensione testo, stile testo, colore sfondo, ecc...), e fare in modo che quando si avvia il programma il file venga letto e riporti tutte le proprietà alla mia TextBox.
    Ho provato serializzando ma non mi salva le proprietà. Questo è il codice che ho usato:

    alla chiusura del programma:
    try
    {
    IFormatter formatter = new BinaryFormatter();
    Stream stream = new FileStream("editor.bin", FileMode.Create, FileAccess.Write, FileShare.None);
    formatter.Serialize(stream, testoTextBox);
    stream.Close();
    }
    catch (SerializationException ex) { }

    all'avvio del programma:
    try
    {
    IFormatter formatter = new BinaryFormatter();
    Stream stream = new FileStream("editor.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
    testoTextBox = (TextBox)formatter.Deserialize(stream);
    stream.Close();
    }
    catch (SerializationException ex) { }


    Grazie in anticipo!

  2. #2
    non mi risulta che una textbox sia [Serializable()] dovrebbe andarti in eccezione fin da subito..

    prova a salvarti solo le proprietà, o dai un'occhiata in giro: http://www.codeproject.com/KB/miscct...lCloneTst.aspx


  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    95
    Come posso fare per salvare le proprietà della TextBox? Ho già provato, ma ho avuto problemi quando dovevo salvare lo stile del testo (grassetto, corsivo, ecc...). Che codice mi consigli di usare? Grazie ancora

  4. #4
    io proverei a scorrermi tutte le proprietà della textbox attraverso la reflection e salverei in un'hashtable i valori delle proprietà che sono contemporaneamente in lettura/scrittura e serializzabili. A quel punto serializzerei l'hashtable. Stessa cosa al contrario, deserializzerei l'hashtable, scorrerei per ogni chiave (con chiave = nome proprietà della textbox) e sempre attraverso la reflection setterei i valori della textbox a quelli dell'hashtable.
    Dovrebbe funzionare

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    95

    Ci sono quasi...

    Ok... ce l'ho quasi fatta (però non ho usato la hashtable).

    Ho dichiarato una variabile di tipo Type uguale a testoTextBox.GetType(). Ho salvato tutte le sue proprietà in un vettore di PropertyInfo e ho serializzato questo vettore. Ora il problema è: come faccio, una volta deserializzato il vettore, a rimettere tutte le proprietà all'oggetto testoTextBox?

    Nel caso in cui mi sono spiegato male scrivo il codice che ho usato:

    alla chiusura del programma
    try
    {
    Type tb = testoTextBox.GetType();
    PropertyInfo[] proprieta = tb.GetProperties();
    IFormatter formatter = new BinaryFormatter();
    Stream stream = new FileStream("editor.bin", FileMode.Create, FileAccess.Write, FileShare.None);
    formatter.Serialize(stream, proprieta);
    stream.Close();

    }
    catch (Exception ex) { }

    all'apertura del programma
    try
    {
    Type tb = testoTextBox.GetType();
    IFormatter formatter = new BinaryFormatter();
    Stream stream = new FileStream("editor.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
    tb = (Type)formatter.Deserialize(stream);
    stream.Close();
    //ora devo assegnare le proprietà salvate nell'oggetto tb all'oggetto testoTextBox
    }
    catch (Exception ex) { }

    Grazie ancora per la pazienza e l'aiuto!

  6. #6
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    Saving the Properties of Components
    http://msdn2.microsoft.com/en-us/library/s5dez165(VS.71).aspx
    I got the remedy

  7. #7
    non credo tu possa successivamente settare le propertyinfo di una classe, ti smanettaci un altro po' ma secondo me ti conviene provare come ti avevo detto, risettando a mano le proprietà della textbox riprendendole dall'hashtable.

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    95
    @albgen
    Mi sembra che in quella pagina spieghi come serializzare, e io avevo provato ma non mi salvava le proprietà, pur usando il BinaryFormatter. Anche se probabilmente avevo sbagliato qualcosa... proverò a guardare bene quel tutorial. Grazie!

    @KataKlism2002
    Sto provando ad usare la hashtable.
    io proverei a scorrermi tutte le proprietà della textbox attraverso la reflection e salverei in un'hashtable i valori delle proprietà che sono contemporaneamente in lettura/scrittura e serializzabili. A quel punto serializzerei l'hashtable. Stessa cosa al contrario, deserializzerei l'hashtable, scorrerei per ogni chiave (con chiave = nome proprietà della textbox) e sempre attraverso la reflection setterei i valori della textbox a quelli dell'hashtable.
    La reflection consiste nel fare una variabile di tipo Type ponendola uguale al metodo GetProperty() oppure e qualcos'altro che non ho capito?

    Grazie nuovamente!

  9. #9
    la reflection è uno strumento molto potente per analizzare (e fare operazioni su) una classe senza sapere a priori che classe sia. Fra le sue utilità c'è la possibilità di farsi dare la collection di tutte le proprietà della classe in questione, è possibile ciclare per questa collection e ottenere informazioni su ugni singola proprietà: se è pubblica, se è readonly, se è sealed, se è un array, se il typo di valori che contiene è serializzabile eccetera eccetera, inoltre ti permette di chiamarne i metodi get e set (se presenti!)

    A te serve di ottenere tutte le proprietà che l'utente può aver modificato e salvarle per ricaricarle successivamente. Di queste proprietà sai quindi sicuramente che non sono in sola lettura e sono sicuramente pubbliche. Tuttavia va aggiunta come clausola che il tipo di dato contenuto dalla proprietà sia serializzabile, perchè per serializzare un oggetto complesso o una collection (come l'hashtable) è strettamente necessario che tutti gli oggetti a sua volta contenuti dall'oggetto siano serializzabili. Quindi se io scrivessi una classe serializzabile con 100 proprietà stringa la potrei serializzare, ma se un domani aggiungessi una proprietà di tipo textbox (un esempio a caso di classe non serializzabile) non potrei più serializzare l'intera classe. Quindi è necessario che nell'hashtable tu metta i soli valori delle proprietà serilizzabili.

    per ciclare nelle proprietà attraverso la reflection usa:
    codice:
    HashTable htTBProperties = new HashTable();
    Type tb = testoTextBox.GetType();
    foreach(PropertyInfo PI in tb.GetProperties(BindingFlags.Public | BindingFlags.Instance))
    {
       Type PropType = PI.PropertyType;
       if (PropType.IsSerializable)
           htTBProperties.Add(PI.Name, PI.GetValue(testoTextBox, null));
    }

  10. #10
    Aggiungerei una cosa: oltre al controllo sulla possibilità di serializzare una proprietà controllerei che la proprietà stessa non sia readonly, ovviamente questo darebbe problemi quando si tenta di settare la proprietà.

    quindi:
    codice:
    HashTable htTBProperties = new HashTable();
    Type tb = testoTextBox.GetType();
    foreach(PropertyInfo PI in tb.GetProperties(BindingFlags.Public | BindingFlags.Instance))
    {
       Type PropType = PI.PropertyType;
       if (PropType.IsSerializable && PI.CanWrite)
           htTBProperties.Add(PI.Name, PI.GetValue(testoTextBox, null));
    }

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.