2017-11-22 10 views
2

D & 9つのフォームのD文字シートを作成していますが、そのうち6つは保存されます。私はこれらの6つのフォームのそれぞれにすべてのTextBoxを保存する必要があります。私はシリアライゼーションをまだ試していないが、私がまだ何をする必要があるかを明確にする特に良いガイドが見つからなかったので、この時点でかなり混乱している。私は、しかし、ファイルに保存しようとし、ファイルが開かれたときに書き戻しました。これは1つのフォームで動作しますが、コードが書かれているような形で複数のフォームでは動作しないことはほとんど確信しています。複数のフォームを単一ファイルにシリアル化または保存する方法

Dim SaveCharacter As StreamWriter 
     If txtName.Text = "" Then 
      MessageBox.Show("In order to save, you must at least enter a name for your character.", "Error: No Name Entered") 
     Else 
      SaveCharacterAs.ShowDialog() 
      System.IO.File.WriteAllText(SaveCharacterAs.FileName, "") 
      Try 
       For Each cnt In Me.Controls.OfType(Of TextBox) 
        SaveCharacter = File.AppendText(SaveCharacterAs.FileName) 
        SaveCharacter.WriteLine(cnt.Text) 
        SaveCharacter.Close() 
       Next 
       For Each cnt In frmAttributeRoller.Controls.OfType(Of TextBox) 
        SaveCharacter = File.AppendText(SaveCharacterAs.FileName) 
        SaveCharacter.WriteLine(cnt.Text) 
        SaveCharacter.Close() 
       Next 

上記のコードは、ファイルに書き込むためのコードです。私はフォームに入力された文字の名前を持つ.txtファイルにファイルを保存しようと考えていました。保存している各サブフォームに対して、フォームと連結された文字の名前で別の.txtファイルを作成しますそれらのファイルをすべて正しい形式で開くコードを書いてください。しかし、ユーザが間違ったファイルを選択して起動するのは面倒です。シリアル化せずに複数のフォームを1つのファイルに保存するより良い方法はありますか?私の最善の賭けをシリアル化していますか 助けてくれてありがとう!

+0

フォームやコントロールを保存したり、シリアル化したりするのではなく、テキストだけを保存することはありません。クラスオブジェクトのコレクションは、1つのファイルに簡単にシリアル化できます。指向プログラミングはすばらしいことです – Plutonix

+0

また、制御テキストを盲目的にファイルに書き込むことはかなり脆弱であることも知っておくべきです。UIを少し変更すると、以前に保存されたファイルを互換性のないものに変更する可能性があります – Plutonix

+0

したがって、私のフォームを のように1つのファイルに変換します。Me.Controls.OfType(Of textBox)としてDim cnt? –

答えて

0

ここに提案があります。文字シートフィールドを記述するテーブルを持つDataSetを作成します。次に、そのDataSetのインスタンスを作成し、デフォルト(大部分は空白)の値を持つレコードをテーブルに追加します。

これで、このようなテキストボックスに列をバインドすることができます。 (私はメモリからこれをやって、それがコンパイルされない場合は、私を許している - それはする必要があり、少なくともポイントにあなたを正しい方向に

Dim ds As New CharacterDataSet ' Whatever you call your dataset 
Dim bs As New BindingSource(ds, ds.CharacterTable.TableName) 
bs.MoveFirst() 
' Note, if you end up having more than one record, you can use bs.Filter 
' to select which record the BindingSource points to. 

txtCharacterName.DataBindings.Add("Text", bs, "CharacterName") ' Where CharacterName is the name of the column in the table 
cboCharacterRace.DataBindings.Add("SelectedValue", bs, "Race") ' For a ComboBox 

また、あなたは、列名に持つより堅牢になりたい場合は

DataSet.WriteXMLを使用すると、データセット全体をワンショットで書き出すことができます。DataBindings.Addを使用すると、ds.CharacterTable.CharacterNameColumn.ColumnNameのような処理を行うことができます。

関連する問題