2017-11-03 6 views
0

私はデータの復号化に取り組んでおり、データグリッドを使ってデータを表示しています。この問題は、既存のレコードを編集して保存した後に発生します。保存プロセスの後、データは復号化されますが、データ行がクリックされるとデータが突然暗号化されます。ストリームライターはこれに責任がありますか?ストリームライターを閉鎖する必要がありますか?Datagridはファイルを保存した後、復号化されたXMLデータを表示しません...ストリームライターを閉じる必要はありますか?

namespace someProgram 
{ 
    public partial class formManage : Form 
    { 
     private readonly XmlSerializer xs; 
     private AddressBook ls; 
     private int _counter = 0; 
     private string currentFileName; 
     public string title { get; set; } 
     int selectedRow; 
     private static Random random = new Random(); 

     public formManage() 
     { 
      InitializeComponent(); 

      ls = new AddressBook(); 
      xs = new XmlSerializer(typeof(AddressBook)); 
      currentFileName = ""; 
     } 

     public void saveToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      var saveFileDialog = new SaveFileDialog(); 
      saveFileDialog.RestoreDirectory = true; 
      saveFileDialog.Title = "Select save location file name"; 
      saveFileDialog.Filter = "XML-File | *.xml"; 
      if (saveFileDialog.ShowDialog() == DialogResult.OK) 
      { 
       StreamWriter writer = new StreamWriter(saveFileDialog.FileName) 

        SaveFile(writer); 

      } 
     } 

     public void SaveFile(StreamWriter writer) 
     { 
      foreach (var item in ls.Contacts) 
      { 
       item.Question1 = XMLEncryption.Model.Helpers.Encryptor.Encrypt(item.Question1); 
       item.Question2 = XMLEncryption.Model.Helpers.Encryptor.Encrypt(item.Question2); 
       item.Question3 = XMLEncryption.Model.Helpers.Encryptor.Encrypt(item.Question3); 
      } 
      xs.Serialize(writer, ls); 
      MessageBox.Show("File saved... "); 
     } 

     private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) 
     { 
      selectedRow = e.RowIndex; 
      if (selectedRow >= 0) 
      { 
       buttonUpdate.Enabled = true; 
       DataGridViewRow row = dataGridView1.Rows[selectedRow]; 

       if (dataGridView1.SelectedRows.Count > 0) 
       { 
        string question1 = dataGridView1.SelectedRows[0].Cells[4].Value + string.Empty; 
        string question2 = dataGridView1.SelectedRows[0].Cells[6].Value + string.Empty; 
        string question3 = dataGridView1.SelectedRows[0].Cells[8].Value + string.Empty; 

        textBoxQuestion1.Text = question1; 
        textBoxQuestion2.Text = question2; 
        textBoxQuestion3.Text = question3; 
       } 
      } 
     } 
    } 
} 
+0

小さいピ暗号化と復号化の方法が正しく機能することを確認するDGVメソッドをテストする。あなたの質問は、特定の答えを出すにはあまりにも広すぎます。 – jdweng

+0

暗号化されたメソッドと復号化されたメソッドは、期待通りに機能します。 datagridviewも期待どおりに動作し、これはプロジェクトの省略バージョンです。ストリームリーダーがこれを担当しているようですが、私はそれを修正する方法がわかりません – tony

+0

xmlをデシリアライズする前に、データを復号化する必要があります。したがって、デシリアライザを呼び出す前に復号化してください。 – jdweng

答えて

1

メモリ内で使用しているアドレス帳の質問を暗号化する必要がありますか?そうでなければ、保存時に暗号化されたアドレス帳の新しいインスタンスを作成することができます。

public void SaveFile(StreamWriter writer) 
{ 
    AddressBook encryptedBook = New AddressBook(); 

    foreach (var item in ls.Contacts) 
    { 
     var encryptedContact = new Contact 
     { 
      Question1 = XMLEncryption.Model.Helpers.Encryptor.Encrypt(item.Question1), 
      Question2 = XMLEncryption.Model.Helpers.Encryptor.Encrypt(item.Question2), 
      Question3 = XMLEncryption.Model.Helpers.Encryptor.Encrypt(item.Question3) 
     }; 

     encryptedBook.Contacts.Add(encryptedContact); 
    } 

    xs.Serialize(writer, encryptedBook); 
    MessageBox.Show("File saved... "); 
} 
+0

私はこの解決策を試しましたが、私は同じ結果を得ます。また、元の投稿を更新しました。より深いデバッグの後、私は問題を私が保存するときに見つけた。保存した後、ファイルはもはやデシリアライズされなくなったようですが、私はまだその理由を理解できません。 – tony

0

回答が見つかりました。 streamreaderとstreamwriterのようなiDisposeを実装するオブジェクトの場合、自動的にストリームを処理する "Using"ステートメントを使用する必要があります。 EXのために...

using(StreamReader sr = new StreamReader("myfile.txt")){//do stuff here} 

これは、StreamReaderをは廃棄されると、私はページをリロードまたはオープンルーチンを呼び出すいずれかの方法で文書を再読み込みすることができます保証します。本質的に私はストリームを使用して読み書きクラスを作成しました。使用するステートメントでそれらをラップし、ストリームが適切に処理されたためにバグが解決されました。

関連する問題