none
DataGridViewの最後のCell RRS feed

  • 質問

  • いつもお世話になります。

    DataGridViewでCurrentCell を取得するにあたり、

    if (iRow == dailyGridView.RowCount - 2)

    というステートメントでは、

    CurrentCell がデータの最後のCell なのか

    * マークの追加用のCell なのかの区別がつきません。

    そこで、CurrentCell がどちらなのかを区別する方法を知りたいのです。

    どうぞ、よろしくお願いいたします。

    2007年1月20日 9:07

回答

  • コードでやるなら以下のような感じかな? ちょっと動きが嫌らしい。 あんまり良いコードじゃないかも。

            bool _isNewRow;

     

            private void button1_Click(object sender, EventArgs e)

            {

                if (!_isNewRow)

                {

                    tESTDataGridView.CurrentCell = tESTDataGridView[4, tESTDataGridView.CurrentRow.Index - 1];

                }

                else

                {

                    tESTDataGridView.CurrentCell = tESTDataGridView[4, tESTDataGridView.CurrentRow.Index];    //既にCurrentCellは一つ上の行に移っている。

                    tESTDataGridView[4, tESTDataGridView.CurrentRow.Index + 1].Selected = false;    //同じ列の場合、以下の2行がなぜかいる。

                    tESTDataGridView[4, tESTDataGridView.CurrentRow.Index].Selected = true;

                }

     

                _isNewRow = false;

            }

     

            private void tESTDataGridView_RowLeave(object sender, DataGridViewCellEventArgs e)

            {

                _isNewRow = tESTDataGridView.CurrentRow.IsNewRow; 

            }

    2007年2月6日 5:32
    モデレータ

すべての返信

  • DataGridViewRow の IsNewRow プロパティなんかいかがでしょう。
    2007年1月20日 11:39
  • 恐れ入ります。

    IsNewRow ならいける!と、思いきや、

    DataGridViewの最後の行の次の*の行をクリックしてから、

    dailyGridView.CurrentRow.IsNewRow

    でも、

    int iRow = dailyGridView.CurrentCell.RowIndex;

    dailyGridView.Rows[iRow].IsNewRow

    でも、結果は同じく、*の行ではなく、最後の行を得てしまいます。

    どうしたらよいのでしょうか?

    2007年1月20日 18:31
  • 状況がよく把握できないのですが、

    dailyGridView.CurrentRow.IsNewRow

    でも

    dailyGridView.Rows[iRow].IsNewRow

    でも、falseになるということなんでしょうか?

    2007年1月21日 2:40
    モデレータ
  • 返信が遅くなってしまいましたが、その通りなのです。

    クリックイベント直後なのですが、特に別のコードをはさんでいるというわけでもないのに、IsNewRow が常に false を返すのです。何か、変なことなのでしょうか?

    2007年1月21日 14:11
  • クリックイベントというのは、CellClickイベントでしょうか? こちらで試す限り、trueになります。
    どのようなコードを書かれていますか?
    2007年1月21日 14:26
    モデレータ
  • 下記のように、ボタンのクリックイベントです。

    最初に、*の行のいづれかの列のセルをクリックしたうえで、

    private void previousButton_Click(object sender, EventArgs e)

    {

        int iClm = dailyGridView.CurrentCell.ColumnIndex;

        int iRow = dailyGridView.CurrentCell.RowIndex;

        if (dailyGridView.CurrentRow.IsNewRow){

    }

    でも

        if (dailyGridView.Rows[iRow].IsNewRow){

    }

    でも、IsNewRow がfalseなので、

    else if (iRow != 0)

        dailyGridView.CurrentCell = dailyGridView[iClm, iRow - 1];

    のコードが実行されて、最後のひとつ前の行にCurrentCell が移動してしまいます。

     

    previousButtonは、よくある[<]マークのボタンで、

    *の行から、DataGridView あるいはDataViewの最後の行にCurrentCellを移動させたいところなのです。

    上記のコードでは、この[<]ボタンをクリックした結果として、

    1.最後の行なら、最後のひとつ前の行にCurrentCell を移動したい

    2.*の行なら、最後の行にCurrentCellを移動したい

    という、とても単純な操作をコードにしたいだけなのですが、

    上記のどちらも、最後の前の行に移動してしまいます。

    2007年1月21日 15:25
  • ああ、なるほど。

    新規行に何も入力せず他のコントロールにフォーカスを移した場合、現在行は新規行の一つ上、データがある最終行に自動的に戻ります。この仕様そのものは妥当な動きだと思いますが、お望みの機能を実現する場合には厄介ですね。ついでに選択中のセルとフォーカス中のセルが別になってるのも分かりづらい。

    RowLeave イベントあたりで現在行を保存し、ボタンの Click イベントで比較するとかそんな感じになるかな?

    2007年1月21日 17:03
  • 返信が大変遅くなってしまい、申し訳ありません。

    RowLeave イベントを覚えようとしているところでした。

    ウィルス撃退ソフトの期限切れのために、パソコンに拡大する脅威が訪れたようで、マシンのリカバリをする羽目になってしまっていました。

    ご教授のイベントについては、目下調査中です。ありがとうございます。

    しかし、こんなことがあまり問題にならないところからすると、DataGridViewを操作させるような自分だけのプログラムを皆さんが作っているのではなくて、一般ユーザー用のソフトを作っているためだろうなと、感じました。

    DataGridViewを直接操作するのは、自分だからですね?

    2007年2月4日 13:02
  • previousButton ボタンの CausesValidation を false にすると、IsNewRow が期待通りになると思います。

    私も半年ほど前に「削除ボタン」を実装するときに困ったのですが、その際そのような対処していました。
    ハズしていたらすいません。

    2007年2月5日 0:31
  • コードでやるなら以下のような感じかな? ちょっと動きが嫌らしい。 あんまり良いコードじゃないかも。

            bool _isNewRow;

     

            private void button1_Click(object sender, EventArgs e)

            {

                if (!_isNewRow)

                {

                    tESTDataGridView.CurrentCell = tESTDataGridView[4, tESTDataGridView.CurrentRow.Index - 1];

                }

                else

                {

                    tESTDataGridView.CurrentCell = tESTDataGridView[4, tESTDataGridView.CurrentRow.Index];    //既にCurrentCellは一つ上の行に移っている。

                    tESTDataGridView[4, tESTDataGridView.CurrentRow.Index + 1].Selected = false;    //同じ列の場合、以下の2行がなぜかいる。

                    tESTDataGridView[4, tESTDataGridView.CurrentRow.Index].Selected = true;

                }

     

                _isNewRow = false;

            }

     

            private void tESTDataGridView_RowLeave(object sender, DataGridViewCellEventArgs e)

            {

                _isNewRow = tESTDataGridView.CurrentRow.IsNewRow; 

            }

    2007年2月6日 5:32
    モデレータ
  • とても参考になりました。

    一からコードを作っていただいて恐縮です。皆さんのおかげで一件落着となりました。

    しかし、ちょっと普通と違う状況ということで、コードが複雑になるのは致し方ないことなのでしょうか。初心者ならではの希望ですが、.NET Frameworkの今後に期待したいところです。

    2007年2月7日 13:48