2017-05-09 12 views
0

こんにちは、私はかなりVisual Studioに新しいです、私は私のプログラムに保存機能を追加するいくつかの問題を抱えています。基本的に私のプログラムは、ユーザーのイベントリマインダーを設定しています(毎日のプランナーのようですが、通知はありません)。私は、 "イベントを追加する"、 "削除"、および "プログラムで動作するようにボタンを更新して、今私が残したのは"保存 "と"ロード "キーです。私がやろうとしているのは、DataGridViewを保存して、後で「ロード」キーを使用してプログラムで開くことができるようにする方法です。イベントリマインダーアプリケーションに「負荷」を取り除き情報を保存する方が簡単な場合は、そのルートに進むことができますが、その方法を最初に考えているわけではありません。これは私がメインフォーム内のコードのために、今持っているものです。保存機能をDataGridViewに追加するにはどうすればよいですか?

パブリック・クラスMainForm1

Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick 

    If DataGridView1.Columns(e.ColumnIndex).Name = "Delete" AndAlso Me.DataGridView1.Rows(e.RowIndex).IsNewRow = False Then 
     Me.DataGridView1.EndEdit() 
     Me.DataGridView1.Rows.RemoveAt(e.RowIndex) 
    End If 

    If DataGridView1.Columns(e.ColumnIndex).Name = "Column4" AndAlso Me.DataGridView1.Rows(e.RowIndex).IsNewRow = False Then 
     Dim Update As UpdateWindow 
     Update = UpdateWindow 
     Update.Show() 
    End If 
End Sub 

Private Sub dltBtn_Click(sender As Object, e As EventArgs) 
    Dim dltBtn As dltWindow 
    dltBtn = dltWindow 
    dltBtn.Show() 
End Sub 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim Button1 As addBtn 
    Button1 = addBtn 
    Button1.Show() 
End Sub 

Private Sub UptBtn_Click(sender As Object, e As EventArgs) 
    Dim UptBtn As UpdateWindow 
    UptBtn = UpdateWindow 
    UptBtn.Show() 
End Sub 

Dim thisFilename As String = Application.StartupPath & "\Event reminder.dat" 

Private Sub saveBtn_Click(sender As Object, e As EventArgs) Handles saveBtn.Click 
    Me.Validate() 
    Me.SaveGridData(DataGridView1, thisFilename) 
End Sub 

Private Sub BtnLoad_Click(sender As Object, e As EventArgs) Handles BtnLoad.Click 
    Me.LoadGridData(DataGridView1, thisFilename) 
End Sub 

Private Sub SaveGridData(ByRef ThisGrid As DataGridView, ByVal thisFilename As String) 
    ThisGrid.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableWithoutHeaderText 
    ThisGrid.SelectAll() 
    IO.File.WriteAllText(thisFilename, ThisGrid.GetClipboardContent().GetText.TrimEnd) 
    ThisGrid.ClearSelection() 
End Sub 

Private Sub LoadGridData(ByRef ThisGrid As DataGridView, ByVal Filename As String) 
    ThisGrid.Rows.Clear() 
    For Each THisLine In My.Computer.FileSystem.ReadAllText(Filename).Split(Environment.NewLine) 
     ThisGrid.Rows.Add(Split(THisLine, " ")) 
    Next 
End Sub 

エンドクラス

私は他のフォーラムに行って、これを行う方法について尋ねてきたし、彼らはすべて、データテーブルにデータグリッドビューをバインドすると言った。それが私が行かなければならない道だったら、どうすればいいのですか?誰かが私が試してみることができるいくつかの例やコードがあるなら、私は大いに感謝しています。

答えて

0

投稿コードに見られる問題は、LoadGridDataSaveGridDataの間にあります。 LoadGridDataメソッドが実行されると、各行がスペース ""で "分割"されているファイルが読み込まれます。これは問題ありません。ファイルが適切に "スペース"区切りの場合、期待どおりに動作します。ですから、すべてが正しく動作し、データがグリッドに適切に表示されていると仮定しましょう。

次に、ユーザはSaveGridDataメソッドを呼び出すsaveBtnを押します。コードは、DataGridViewのすべてのセルをクリップボードに「選択」して、グリッドの読み込み時に使用されるSAMEファイル名にクリップボードテキストを書き出します。これは、期待どおりに動作するようにも見えます。

この問題は、コードがDataGridViewのすべてのセルをクリップボードにコピーするときに、このコピーされたクリップボードテキストを書き込みます。それは "タブ"区切り文字を使用します。 「空白」区切り文字を使用して読み取られたEvent reminder.datファイルは、「スペース」区切り記号ではなく「タブ」区切り文字で上書きされます。したがって、次回にloadメソッドが実行されると、失敗します。

ロードと保存ボタンが同じファイルを読み込む場合、どちらの文字が区切り文字として使用されるかはどちらも同意しなければなりません。どのような文字でも区切り文字として使用できます。投稿されたコードのように "スペース"を使うことができますが、これは各タイプをスペースのない文字列に制限します。フィールドの1つが自宅の住所である場合、チャンスは良好です。文字列にスペースがあります。区切り文字として「スペース」を使用することは、必ずしも最良の選択肢ではありません。

現在のコードでは簡単な解決策が得られます。現在、ファイルEvents reminder.datがスペースで区切られ、データグリッドビューに正しく読み込まれている場合は、スペース区切り文字を別のものに置き換えるのは簡単です。この場合、SaveGridDataメソッドはフィールドを「タブ」で区切っているため、ファイルを読み込むときに「スペース」ではなく「タブ」で「分割」するだけでロードメソッドを変更する必要があります。

ステップ1 - 、プログラムを実行し、ロードボタンを押すと、すべてのデータが適切にグリッドにロードされていることを確認します - Events reminder.dat

ステップ2のコピーを作成します。

ステップ3 - データがグリッドに正しく表示されている場合は、保存ボタンを押します。(タブ区切り文字でファイルを更新)

ステップ4 - プログラムを終了し、LoadGridDataメソッドで以下の変更を行います。

ThisGrid.Rows.Add(Split(THisLine, vbTab)) 

ステップ5 - プログラムを実行します。ロードと書き込みの両方の方法は、どの文字(タブ)が区切り文字として使用されるかで一致します。

最後に、DataTableを使用してコメントすると、答えは「はい」となります。 DatagridViewDataTableはうまく一緒に遊びます。お役に立てれば。

Stackoverflowの“Tour”を使用して動作を確認してください。

+0

私はそれを保存しようとしましたが、それをロードしようとしましたが、日付列に水曜日を入れ、DataGridviewのイベント記述列に5月が入っていたので、 – R3DSTON3R

+0

質問に投稿コードを使用している場合は、私が言ったように、 "保存"メソッドは "タブ"を使用してファイルを保存し、データの各列を区切り/区切ります。この "load"メソッドを使用してこのファイルを読み込もうとすると、セパレータ/区切り文字として "spaces"が使用されているため失敗します。したがって、2つの方法では各列に2つの異なる区切り記号/区切り文字が使用されるため、列は正しく一致しません。 "load"メソッドを変更し、空のファイルを使用して開始し、データを追加してからファイルを保存すると、loadメソッドが正しく動作します。 – JohnG

関連する問題