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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.48061 の関連記事表示

<< 0 >>
■48061  DataTableの値の編集について
□投稿者/ JIN -(2010/03/23(Tue) 12:54:44)

    分類:[.NET 全般] 

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

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

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

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

    よろしくお願いいたします。
親記事 /過去ログ81より / 関連記事表示
削除チェック/

■48069  Re[1]: DataTableの値の編集について
□投稿者/ 魔界の仮面弁士 -(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
記事No.48061 のレス /過去ログ81より / 関連記事表示
削除チェック/

■48068  Re[1]: DataTableの値の編集について
□投稿者/ エクシ -(2010/03/23(Tue) 15:57:23)
    2010/03/23(Tue) 16:02:23 編集(投稿者)

    No48061 (JIN さん) に返信
    > 左右と上下に移動するのとでは、値の表示に違いが出てくるものなのでしょうか。
    本質は値の表示ではなく、データの確定が保留されますね。
    その結果、2次的に表示が変わらないのでしょう。
    データベースのテーブルデータを編集するソフトでは、そのような動きをするものが
    多いですね。Access然り、Enterprise Manager然り。
    主キー違反のエラーなども、カレントレコードが変わるまで出ませんし、ESCキーで
    レコード全ての編集内容を破棄し、もとのデータに戻せます。
記事No.48061 のレス /過去ログ81より / 関連記事表示
削除チェック/

■48072  Re[2]: DataTableの値の編集について
□投稿者/ JIN -(2010/03/23(Tue) 16:52:23)
    エクシさん、
    魔界の仮面弁士さん、
    回答ありがとうございます。

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

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

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

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

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

    すみません、DataRowについて調査するべきでした。
    ありがとうございます。
記事No.48061 のレス / END /過去ログ81より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -