|
■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
|