none
DataGridView の 最終行への 行追加

    質問

  • 毎々お世話になります。

    WindowsXP-Pro Ver 2002 SP2 上で
    Visual Studio 2005 Enterprise Edition で
    VB2005 による開発を行っております。

    DataGridView の 最終行に続けて新規行を追加(アペンド)したいのですが、Rows.Add メソッドでは CurrentRow に Insert されてしまいます。

    また、DataGridView にソート用の列("NO")を設けて、 RowsAdded イベントプロシージャ で ソートさせて
    追加行を最終行に移動させるべく下記のように仕込んでみましたが、状況は変わりません。

        Private Sub DataGridView1 _RowsAdded(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowsAddedEventArgs) Handles DataGridView1.RowsAdded
            Dim iRow As Integer
            Dim iCnt As Integer

            With CType(sender, DataGridView)
                iCnt = 1
                For iRow = 0 To .Rows.Count - 1 Step 1
                    If iRow <> e.RowIndex Then
                        .Rows(iRow).Cells("NO").Value = iCnt
                        iCnt = iCnt + 1
                    End If
                Next iRow
                .Rows(e.RowIndex).Cells("NO").Value = iCnt
                .Sort(.Columns("NO"), System.ComponentModel.ListSortDirection.Ascending)
            End With
        End Sub

    何かうまい手はないでしょうか?

    よろしくお願いします。

    2011年6月14日 3:19

回答

  • こんな感じでどうでしょうか
        private void button1_Click(object sender, EventArgs e)
        {
          dataGridView1.BeginEdit(false);
          dataGridView1.CurrentCell = dataGridView1[0, dataGridView1.NewRowIndex];
          dataGridView1.CurrentRow.SetValues(5, "", "", 9); // 適当に値セット
          dataGridView1.NotifyCurrentCellDirty(true);
          dataGridView1.EndEdit();
        }
    

    このへんのスレッドが似てるように思います
    http://social.msdn.microsoft.com/Forums/ja-JP/vbgeneralja/thread/ecaf1560-2cad-4d04-a5e2-4b4eaf760d2d/#08ce832a-3369-4195-a2a9-27907aa6eb6c
    2011年6月14日 6:38

すべての返信

  • ・データをバインドしているかどうか
    ・列ヘッダでソートしているか
    とかによって取れる手段が変わってくるように思います。
    とりあえず、何も考えずバインドしてそこから追加した場合は常に一番下になるようなので
    そこから何か違うことがあれば情報として出したほうが良いと思います。
    また、dataGridView1.AllowUserToAddRowsプロパティをtrueにしておくと
    常に入力行が出た状態になりますが、それではまずいのですか。

    ちなみにRows.AddはDataGridViewクラスにも、おそらく今回のデータソースであろうDataTableクラスにもあります。
    この場合はどちらでしょうか。
    バインドしてなきゃ関係ない話ではありますが。

    2011年6月14日 4:44
  • mars12 様、回答ありがとうございます。

    まずバインドについてですが、今回はデータバインドはしていません。

    そして、列ヘッダは非表示の列”NO"のみProgrammatic で、それ以外はNotSortable に設定してあります。

    また、AllowUserToAddRows プロパティはTrueにしてあります。(入力行が出た状態になります)

    入力行にプログラムから直接CellsのValueプロパティに値を代入すると、キー入力と違い新しい入力行は出てきません。

    キー入力の時と同じように順次新規入力行がグリッドの最終行に出てくるようにしたいのです。

    説明が不十分で申し訳ありませんでした。

    よろしくお願いします。

    2011年6月14日 5:30
  • こんな感じでどうでしょうか
        private void button1_Click(object sender, EventArgs e)
        {
          dataGridView1.BeginEdit(false);
          dataGridView1.CurrentCell = dataGridView1[0, dataGridView1.NewRowIndex];
          dataGridView1.CurrentRow.SetValues(5, "", "", 9); // 適当に値セット
          dataGridView1.NotifyCurrentCellDirty(true);
          dataGridView1.EndEdit();
        }
    

    このへんのスレッドが似てるように思います
    http://social.msdn.microsoft.com/Forums/ja-JP/vbgeneralja/thread/ecaf1560-2cad-4d04-a5e2-4b4eaf760d2d/#08ce832a-3369-4195-a2a9-27907aa6eb6c
    2011年6月14日 6:38
  • Mars12 様、ありがとうございました。

    無事最終行への行追加が実現できました。

    大変助かりました。

    2011年6月14日 15:16