投稿者 魔界の仮面弁士  (社会人) 投稿日時 2019/8/27 09:41:18
DataMember が、ところどころで
DataMenber になっているのが気にかかりますが、それはさておき。


> 直前に、dt1(TableNameは"クエリ1")をRemoveし、一度DataSetからdt1を除去し、
そのあとにdt1を再生成し(TableNameは引き続き"クエリ1")、

DataSet のインスタンスは引き続き同じものを使っており、
DataTable のインスタンスだけを新たに作り直した……という事ですね。


> DataGridViewのDataSourceやDataMenberをNothingにしてから
> 再びDataSourceをDataSet、DataMemberを"クエリ1"に指定していますのに。

先の『ところがその後、DataGridViewが更新されません。』という表現が、
「レコードの追加」を行うためにどのような操作をしていたのかが分かりませんでした。

実際の事例に沿ったものでなくても良いので、状況が伝わりやすくなるよう、
最低限のコードを提示した上で質問いただけると有難いです。

たとえばこんな感じで…。(下記はレコード追加の例では無いですが)
Private Ds As DataSet
Private Sub Button1_Click(…
  Rs = New ADODB.Recordset
  '(中略) 
  Da.Fill(Ds, Rs, "クエリ1")

  'これで、クエリ1 の内容が表示されることまでは確認できた 
  dataGridView1.DataSource = Ds
  dataGridView1.DataMember = "クエリ1"
End Sub
Private Sub Button2_Click(…
  'しかし下記のようにしても、何故か DataGridView が空にならなかった 
  Ds.Tables("クエリ1").Row.Clear()
End Sub




=== 以下、先の回答時に自分が連想していたパターンを列挙してみます ===

➊「レコードの追加・編集用フォーム」で編集したときの DataTable の内容を
DataSetビジュアライザーを覗くと、"クエリ1"は更新されていたけれども、
それを「DataGridViewのフォーム」で確認した時に、
>> ところがその後、DataGridViewが更新されません。
という状態になっている…という状況。(先の回答はこれを想定した物です)

➋ まだ「レコードの追加・編集用フォーム」での操作するまでには至っておらず、
DataGridView 上の新規追加行に書きこんだ上で
DataSet ビジュアライザーの内容を見たときに、DataGridView の編集結果が
DataSet に反映されていなかった…という状況。

➌ "クエリ1" を持つ DataTable に対して .Rows.Add した後で、
DataSet ビジュアライザーの内容を見ると書き換わっているのに、
それが DataGridView の表示に反映されていない…とい状況。


> ケース①
> ケース①-2
> ケース② 
ありがとうございます。
どのように確認したのかという状況が、少し把握しやすくなりました。


> DataSetとDataGridViewの間に、除去する前のデータを格納する場所があるかのようです。

DataSet や DataTable をバインドした場合、実質的には DataTable の DefaultView がバインドされます。
この場合の DefaultView は、既定で DataViewRowState.CurrentRows モードであるために、
DataTable 上で削除済みとしてマークされた行については、
DataSet 上には存在していますが、そのままだと DataGridView には表示されません。
でも、今話しているのはそのことではなさそうですね。


また、DataGridView 上で編集されたデータは、その処理タイミングごとに、
 (1)バインド元の DataRow が、まだ何も編集されていない状態(DataRowState が Unchanged)
 (2)ユーザーの入力によって、DataGridViewEditingControl 上で入力されたが、
  バインド元の行にはまだ伝わっていない段階
 (3)ユーザーからの入力が DataRowView を通じて DataRow に渡されたが、
  その行はまだ、DataTable の行としてアタッチされていない状態(DataRowState が Detached)
 (4)DataTable の内容が DataRow に渡されており、DataRowState が
  編集行(Modified)、削除行(Deleted)、新規行(Added)のいずれかとして
  マークされている段階
の 4 段階の遷移を取ります。
なので、(2) や (3) の時点で確認すると、DataGridView の内容と DataSet の内容に
タイミング的なズレが生じます。上記 ➋ の場合は (1) や (2) の段階がありえますね。



> ケース①
> DataGridViewのDataSourceやDataMenberをNothingにしてから、
> DataSourceをDataSetに指定し、DataMemberにはDataSetにはない"Query"を再び指定してやると、
> DataSetビジュアライザにて"Query"は存在せず、"Query1"が存在することを確認しましたが、
> エラーなくDataGridViewに"Query"が表示され、あたかも未更新のようになりました。

これはデータをリロードする処理でしょうか。
DataSoure や DataMember の操作が反映されていないようであるのだと理解しました。

最初はスペルミス等により、コードから操作している DataGridView というのが、
実は画面上に見えている DataGridView とが別物だったという可能性を疑いましたが、
でもそれだと、ケース①-2 や ケース② の説明がつかないですものね…。


この割り当てはどのタイミングで行っていますか?
Button1_Click とかでしょうか?

64bit 環境の場合は、Form1_Load で例外が発生しても気がつきにくいのでご注意ください。
http://rucio.cocolog-nifty.com/blog/2011/04/post-f125.html

とりあえず、手元の環境では ① のパターンを確認できなかったので、現象を再現するために、
この部分に関与するコードを提示頂けないでしょうか。こちらで追試してみたいと思います。