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

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

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

Re[2]: DataTableの値の編集について


(過去ログ 81 を表示中)

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

■48061 / inTopicNo.1)  DataTableの値の編集について
  
□投稿者/ JIN (11回)-(2010/03/23(Tue) 12:54:44)

分類:[.NET 全般] 

お世話になります。
早速ですが、
DataGridViewにDataTableをバインドさせ値を表示し、
セルの値を編集後、CellEndEditのイベントから計算処理を実行させています。

お聞きしたいのは、
計算結果をDataTabeに格納することで、
DataGridViewのセルに反映させているのですが、

セルの値を編集後、矢印の↑と↓のキー、あるいはEnterで上下に
カーソルを移動させると正常に計算結果が表示されるのですが、
Tabキーや、←と→のキーで左右に移動させると、
内部の計算処理はうまく行くのですが、
DataGridViewのセルに値が表示されず、上下にカーソルを移動させると、
目的どおりの値が表示されます。

左右と上下に移動するのとでは、値の表示に違いが出てくるものなのでしょうか。
同じような現象に遭ったことがある方がいらっしゃいましたら
ご教授願えないでしょうか。

よろしくお願いいたします。

引用返信 編集キー/
■48068 / inTopicNo.2)  Re[1]: DataTableの値の編集について
□投稿者/ エクシ (1回)-(2010/03/23(Tue) 15:57:23)
2010/03/23(Tue) 16:02:23 編集(投稿者)

No48061 (JIN さん) に返信
> 左右と上下に移動するのとでは、値の表示に違いが出てくるものなのでしょうか。
本質は値の表示ではなく、データの確定が保留されますね。
その結果、2次的に表示が変わらないのでしょう。
データベースのテーブルデータを編集するソフトでは、そのような動きをするものが
多いですね。Access然り、Enterprise Manager然り。
主キー違反のエラーなども、カレントレコードが変わるまで出ませんし、ESCキーで
レコード全ての編集内容を破棄し、もとのデータに戻せます。
引用返信 編集キー/
■48069 / inTopicNo.3)  Re[1]: DataTableの値の編集について
□投稿者/ 魔界の仮面弁士 (1571回)-(2010/03/23(Tue) 16:05:56)
No48061 (JIN さん) に返信
> 左右と上下に移動するのとでは、値の表示に違いが出てくるものなのでしょうか。
データが『行単位』で確定されるためです。

たとえば、主キーとして複数列が割り当てられていた場合を考えてみてください。
それらの必須入力列に値が入っていないと、制約違反になってしまいますから、
新規行を作成する際には、複数の列に値を代入してからでないとデータを確定できませんよね。

そのため、
 (1) DataGridView 上で編集中の値
 (2) DataRowView/DataRow で編集中の未確定の値
 (3) DataTable/DataSet に保存された値
は、連続した別のタイミングで確定されていく事になります。

上記の流れについて、少し実験してみましょう。3列構成のDataTableを用意し、それを
DataGridView にバインドさせた後、最下部の行に移動して新規行の入力を行うとします。

ここで、新規行の 1 列目に "111" と入力し、さらに Tab(または→)キーで右隣の2列目に
移動して "222" と入力します。そしてそれを確定させず、続けて[Esc]を押してみます。
そうすると、222 の入力がキャンセルされて「111/空/空」の状態に戻ります。
そして、そこからさらに続けて[Esc]を押せば、新規行の入力さえもキャンセルされ、
行を追加する前の状態に戻ってくることが分かるかと思います。



もし、セル単位で入力確定させたいのであれば、セルの編集後に
データの入力を確定させてしまえば OK です。たとえば、こんな感じで。

Public Class Form1
 Private tbl As DataTable

 Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
  tbl = New DataTable()
  tbl.Columns.Add("F1", GetType(Decimal))
  tbl.Columns.Add("F2", GetType(Decimal))
  tbl.Columns.Add("F3", GetType(Decimal), "F1*F2")
  tbl.Rows.Add("1.200", "2.000")
  tbl.Rows.Add("1.10", "3.00")
  Me.BindingSource1.DataSource = tbl
  Me.DataGridView1.DataSource = BindingSource1
  Me.DataGridView1.EditMode = DataGridViewEditMode.EditOnEnter
  Me.CheckBox1.Checked = False
  Me.CheckBox1.Text = "即時反映"
 End Sub

 Private Sub DataGridView1_CellEndEdit(ByVal sender As Object, _
  ByVal e As DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
  If Me.CheckBox1.Checked Then
   Me.BindingSource1.EndEdit()
  End If
 End Sub
End Class
引用返信 編集キー/
■48072 / inTopicNo.4)  Re[2]: DataTableの値の編集について
□投稿者/ JIN (12回)-(2010/03/23(Tue) 16:52:23)
エクシさん、
魔界の仮面弁士さん、
回答ありがとうございます。

無事、問題が解決いたしました。

エクシさん
>データの確定が保留されますね。
その結果、2次的に表示が変わらないのでしょう。

魔界の仮面弁士さん
>(1) DataGridView 上で編集中の値
(2) DataRowView/DataRow で編集中の未確定の値
(3) DataTable/DataSet に保存された値
は、連続した別のタイミングで確定されていく事になります。

確かに、DataTableの値を、DataRowに格納し、行単位で計算処理を実行しています。
ですので、DataRowの値にコミットを実行してみました。

DataRow.EndEdit() '←この一文で問題が解決いたしました。

すみません、DataRowについて調査するべきでした。
ありがとうございます。

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -