C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: DataSetから、xmlファイルへ書き込


(過去ログ 129 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■76550 / inTopicNo.1)  DataSetから、xmlファイルへ書き込むには?
  
□投稿者/ vb初心者 (6回)-(2015/07/22(Wed) 08:23:13)

分類:[VB.NET/VB2005 以降] 

初めまして。
VB2010を使っております。

VBの学習として、VBプログラミング試験の公式サンプル問題(1級の2問目、personaldata)を解いております。

この問題では
Form1で
xmlファイルを読み込む→読み込んだデータをDatasetに記憶→DataGridviewで表示
といった処理をしています。

そこで、質問なのですが

@DataSet(Form1で宣言し、かつxmlファイルを読み込んでいる)を、Form2で参照する方法を教えてください。(Publicで宣言してみたのですが上手くいきませんでした…)

AForm2で参照したDataSetを編集し、編集したセルだけxmlファイルに書き込む方法を教えてください。

初歩的な質問ですみません。
よろしくお願いいたします。
引用返信 編集キー/
■76551 / inTopicNo.2)  Re[1]: DataSetから、xmlファイルへ書き込むには?
□投稿者/ WebSurfer (627回)-(2015/07/22(Wed) 08:56:08)
No76550 (vb初心者 さん) に返信

> @DataSet(Form1で宣言し、かつxmlファイルを読み込んでいる)を、Form2で参照する方法を教えてください。

From2 のコンストラクタに DataSet への参照を引数に持つものを作り、Form2 を初期化する際に Form1
で初期化した DataSet の参照を渡すようにしてはいかがですか?


> AForm2で参照したDataSetを編集し、編集したセルだけxmlファイルに書き込む方法を教えてください。

「編集したセルだけ」というのとちょっと面倒です。行は DataSet.GetChanges メソッドで取得できるの
で「編集した行だけ」ではいかがですか?

DataSet.GetChanges メソッド
https://msdn.microsoft.com/ja-jp/library/system.data.dataset.getchanges(v=vs.110).aspx

編集されると DataSet がどうなるかは以下の記事の「図 1 DataSet 内の更新イメージ」が一目瞭然で分
かりやすいので見てください。

DB 設計者のための明解 ADO.NET 第 1 回
https://msdn.microsoft.com/ja-jp/library/cc482903.aspx

編集結果を XML ファイルに書き込む方法は以下の記事が参考になりませんか?

XML ファイルの更新操作
http://surferonwww.info/BlogEngine/post/2010/09/27/Delete-insert-and-update-operations-of-XML-file.aspx
引用返信 編集キー/
■76556 / inTopicNo.3)  Re[1]: DataSetから、xmlファイルへ書き込むには?
□投稿者/ 魔界の仮面弁士 (419回)-(2015/07/22(Wed) 09:37:06)
No76550 (vb初心者 さん) に返信
> DataSet(Form1で宣言し、かつxmlファイルを読み込んでいる)を、
> Form2で参照する方法を教えてください。
> (Publicで宣言してみたのですが上手くいきませんでした…)

「何を」Publicにしましたか?

いろいろなやり方がありますが、このような場合は、Form2 側に
「DataSet を受け取るための機能」を用意するのが良いとおもいます。


たとえば、Form1 側から
  Using f As New Form2( データセットの変数 )
   f.ShowDialog(Me) 'モーダル呼び出し
  End Using
あるいは
  Dim f As New Form2( データセットの変数 )
  f.Show(Me) 'モードレス呼び出し
のように、Form2 のコンストラクタ引数として渡せるようにするため、
『Form2 側のコンストラクタ』に引数を追加して
Public Class Form2
 Private ds As DataSet
 Public Sub New()
  Me.New(Nothing)
 End Sub
 Public Sub New(ByVal ds As DataSet)
  Me.ds = ds
  InitializeComponent()
 End Sub
End Class
のような実装にしておくとか。


あるいは、Form2 側に「Public Property 何某 As DataSet」のような
『Public なプロパティ』を設けておき、Form1 から、その Form2 のプロパティに対して
DataSet をセットしてやるという手もありますね。


> Form2で参照したDataSetを編集し、編集したセルだけxmlファイルに書き込む方法を教えてください。
随分と漠然とした質問ですね…? (^^;
出力する XML は、どのような書式にしたいのでしょうか。

XML のフォーマットにこだわりが無く、かつ、
編集したセルではなく、編集したレコードの情報でも良いのなら、
 '編集結果のみを集めた DataSet を取得
 Dim changedData As DataSet = ds.GetChanges()

 'その DataSet の、データ部分のみを XML ファイルに保存
 changedData.WriteXml("C:\TEST\sample.xml")

 '「削除された行」や、「更新された行の編集前後の値」まで保持したいなら、こう
 'changedData.WriteXml("C:\TEST\sample.xml", XmlWriteMode.DiffGram)
などと書けます。

もっと自由なフォーマットにしたいなら、LINQ で処理するのが良いかも。
引用返信 編集キー/
■76569 / inTopicNo.4)  Re[2]: DataSetから、xmlファイルへ書き込むには?
□投稿者/ vb初心者 (7回)-(2015/07/23(Thu) 08:50:48)
お返事遅くなってしまいすみません。
Form2からの参照の件は、無事できました!
ありがとうございます。

今はXMLファイルの書き込みの件ですが、
情報が色々と抜けててすみません。

読み込むXMLファイルも、出力するXMLファイルの書式も以下の通りです。
ある一定人数の情報をもった書式で、これに、WebSurferさんの仰る通り、編集した行(個人データ)のみ「更新」したいと考えています。

<?xml version="1.0" standalone="true"?>
<Table>
<person>
<name>太郎</name>
<address>東京都世田谷区○−△−□</address>
<phone1>03-!!!!-????</phone1>
<phone2>090-\\\\-****</phone2>
</person>
.
.
.(省略)
</person>
</Table>


また、
DataSet.Table().Rows().Item()
にて、書き込めていることが確認できたので、

DataSet.Table().Rows().Item().WriteXml(OpenFileDialog.FileName)
で書き込むことは可能でしょうか?
もしそうなれば、OpenFileDialog(form1で宣言しております)もインスタンスで引数に持ってくる必要がありますかね??

(上手く行かなかったら、GetChangesメソッドを使います…)

度々すみません。
宜しくお願い致します。
引用返信 編集キー/
■76570 / inTopicNo.5)  Re[3]: DataSetから、xmlファイルへ書き込むには?
□投稿者/ 魔界の仮面弁士 (422回)-(2015/07/23(Thu) 09:44:28)
2015/07/23(Thu) 09:53:51 編集(投稿者)

No76569 (vb初心者 さん) に返信
> 編集した行(個人データ)のみ「更新」したいと考えています。
バイナリファイルや固定長ファイルなら、ファイルの部分編集も可能ですが、
テキストファイルの部分編集は基本的にできません。
(XML ファイルはテキストデータです)

更新した DataTable の内容を XML ファイルとして保存するのであれば、
XML ファイルの一部を書き直すのではなく、ファイル全体を上書きして
再作成する(または別のファイルとして新規作成する)かのいずれかですね。


更新された行のみを含んだ XML として出力したいのであれば、
.GetChanges した結果を .WriteXml すればよいですし、
更新済み行だけでなく、未編集の行も含んだ現内容すべてを出力するなら、
.GetChanges せずに .WriteXml すれば OK です。


> DataSet.Table().Rows().Item()
dataSet.Tables(t).Rows(r).Item(f) もしくは
dataSet.Tables(t).Rows(r).ItemArray の間違いでは?


> DataSet.Table().Rows().Item().WriteXml(OpenFileDialog.FileName)
> で書き込むことは可能でしょうか?
当然無理です。既に試されていることとは思いますが、
DataTable の Rows プロパティから返される DataRowCollection 型、
Rows(r) から返される DataRow 型、
DataRow の ItemArray から返される Object() 型、
DataRow の Item(f) から返される Object 型、
そのいずれにも、『WriteXml メソッド』は実装されていません。

WriteXml メソッドを持つのは、DataSet 型 および DataTable 型です。
(実際の利用例は、既にサンプルを提示していますよね)


> もしそうなれば、OpenFileDialog(form1で宣言しております)もインスタンスで引数に持ってくる必要がありますかね??
いいえ。OpenFileDialog を渡す必要はありませんし、この場合は渡すべきでもありません。

そもそも OpenFileDialog は、「ファイル名をユーザーに決めさせる」ための手段に過ぎません。

WriteXml メソッドが必要としているのは、『保存先のファイルパスを示す String 値』であり、
その String の提供元が、TextBox なのか OpenFileDialog なのか固定値なのかは、
WriteXml にとっては意味の無いことです。
受け渡すとすれば、OpenFileDialog ではなく、ファイルパスを表す String でしょうね。

あるいは、実際の保存処理が Form2 側にあるのなら、OpenFileDialog は Form1 側に持たせず、
Form2 側に持たせておいた方が良い場合もあるかと思います。まぁ、最終的にどうするべきかは、
こちらでは判断できかねますけれども…(情報不足)


> (上手く行かなかったら、GetChangesメソッドを使います…)
……? 保存処理と GetChanges は関係ないですよね?

GetChanges の役目は、「編集された行のみ」を集めた DataSet (あるいは DataTable) を
作ることにあります。WriteXml で保存結果に対しては影響を与えることにはなりますが、
保存処理そのものとは無関係なので、今の OpenFileDialog の話とは繋がらないと思いますよ。


> <address>東京都世田谷区○−△−□</address>
住所の町名が抜けている点が気になりました。北沢とか祖師谷とか。
(本題とは関係ないですが)
引用返信 編集キー/
■76571 / inTopicNo.6)  Re[3]: DataSetから、xmlファイルへ書き込むには?
□投稿者/ WebSurfer (628回)-(2015/07/23(Thu) 09:59:25)
No76569 (vb初心者 さん) に返信

> DataSet.Table().Rows().Item().WriteXml(OpenFileDialog.FileName)
> で書き込むことは可能でしょうか?

できないです。

相手がファイルなので、そもそもセルだけ、行だけ更新というのは無理でした。見当は
ずれな回答をしてすみません。

なので、DataSet.GetChanges メソッドで編集された行だけ取得するという作業も無駄で、
結局、編集された DataSet 全部を使ってファイルごと書き直しするしかなさそうです。
引用返信 編集キー/
■76578 / inTopicNo.7)  Re[4]: DataSetから、xmlファイルへ書き込
□投稿者/ vb初心者 (8回)-(2015/07/23(Thu) 22:08:41)
2015/07/23(Thu) 22:09:57 編集(投稿者)

度々ご回答ありがとうございます。
私の説明不足で本当にすみません。

http://www.sikaku.gr.jp/js/vb/ind/about/sample/files/1q/vb1_net.pdf
この8ページ目からのものと同じものを作っています。
フォーム1のデザインは10ページの図3、
フォーム2は10ページの図4です。

図3のBのセル(DataGridView)を直接クリックして編集後、
フォーム2で、また別のデータを編集してOKボタンをクリックすると、
直接クリックしてセルを(DataGridView)編集した箇所まで保存されてしまいます。
これをどうにかして回避したいと悩んでいたところでした。

DataGridViewを編集した時点で、
DataSetの内容が書き換えられてしまうようですね・・。

やはり、行だけ更新というのは厳しそうですので、
別の方法を考えてみました。

@XMLファイルを読み込んだ時点で、Form1に表示するDataSetとは
別のDataSet(DataSet2とします)にコピーし、バックアップを作っておく。
AForm2でセルを編集したあと、編集した内容のセル(行)のみDataSet2に保存し、
DataSet2の内容を全て読み込んだXmlファイルに上書き(書き直し)する。

・・・というのは可能でしょうか?
もし可能であればお教え願います。

無理そうでしたら、
Form2を開くときに、
Form1のセル(DataGridView)が編集されていたらメッセージボックスを表示する
ようにしたいと考えています。
セルが編集されているかどうかを判断するメソッドがあればお教え願います。

何度もわがままを申し上げてしまいすみませんが、
宜しくお願いいたします。


DataGridView、DataSet、OpenFileDialogの
読み込み・バインド部分のソースです。
少しでも参考になれば幸いでございます。
------------------Form1 ----------------------------------------
Public ds As DataSet

Private Sub OpenFileDialog_FileOk(...)Handles ofdXML.FileOk
ds = New DataSet()
ds.ReadXml(OpenFileDialog.FileName)
DataGridView.DataSource = ds
DataGridView.DataMember = "person"
...
End Sub
----------------------------------------------------------------


>> <address>東京都世田谷区○−△−□</address>
> 住所の町名が抜けている点が気になりました。北沢とか祖師谷とか。
> (本題とは関係ないですが)
すみません。フェイクをかけたくて文字列を適当に削除したら
町名を忘れておりました・・
引用返信 編集キー/
■76583 / inTopicNo.8)  Re[5]: DataSetから、xmlファイルへ書き込
□投稿者/ WebSurfer (630回)-(2015/07/24(Fri) 11:50:25)
No76578 (vb初心者 さん) に返信

> http://www.sikaku.gr.jp/js/vb/ind/about/sample/files/1q/vb1_net.pdf
> この8ページ目からのものと同じものを作っています。

それを全部詳細に見て理解するというのは自分には負担が大きすぎるので斜
め読みしかしてませんが、図3は表示だけで、編集操作は図4行うのが要件
のように見えます。

であれば、

> 図3のBのセル(DataGridView)を直接クリックして編集後、

という操作を行ってるのが解せません。編集できないようにすれば済む話だと
思うのですが違いますか?

(DataGridView ではなくて DataGrid を使えというのが要件のようですが?)

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -