none
DataGridViewで末尾行に移動したときに追加を確定する方法 RRS feed

  • 質問

  • DataGridViewを使用しています。
    ユーザからの要望により

    通常、追加するときは末尾行を選択肢し入力し選択行を移動すると確定されます。
    これを末尾行を選択した時点でいったん確定させたいのです。
    DataGridViewでこの動作を実現するにはどのように実装させればよいのでしょうか?

    2009年9月9日 6:35

回答

  • こんな?

    public class Form1 : Form
    {
        public  Form1()
        {
            DataTable dt = new DataTable();
            DataColumn col1 = new DataColumn("", typeof(int));
            col1.Unique = true;
            col1.AutoIncrement = true;
            col1.AutoIncrementSeed = 0;
            col1.AutoIncrementStep = 1;
            col1.ReadOnly = false;
    
            dt.Columns.Add(col1);
            dt.Columns.Add();
    
            DataGridView dgv = new DataGridView();
            dgv.Dock = DockStyle.Fill;
            dgv.SelectionChanged += DataGridView_SelectionChanged;
    
            dgv.DataSource = new BindingSource(dt, null);
            this.Controls.Add(dgv);
        }
    
        private int rowIndexOld = -1;
    
        private void DataGridView_SelectionChanged(object sender, EventArgs e)
        {
            DataGridView grid = (DataGridView)sender;
            if (grid.CurrentCell != null)
            {
                int rowIndexNew = grid.CurrentCell.RowIndex;
                if ((rowIndexOld != rowIndexNew) && (rowIndexNew == grid.RowCount - 1))
                {
                    BindingSource source = (BindingSource)grid.DataSource;
                    object pos = source.Current;
                    source.CurrencyManager.EndCurrentEdit();//確定
                    source.Position = source.IndexOf(pos); //DatagridViewがソートされていると確定で並べ替えされて行がずれるので一致させる
                }
                rowIndexOld = rowIndexNew;
            }
        }
    }


    2009年9月9日 9:09
  • EndEdit()を実行してみて下さい。

    DataGridView.EndEdit メソッド
    http://msdn.microsoft.com/ja-jp/library/system.windows.forms.datagridview.endedit(VS.80).aspx
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年9月9日 8:25
    モデレータ
  • 末尾行に移動したときに追加したいのです。

    噛み合っていないようで、すみません。末尾行に移動した時点で、列が全て空白(未入力)のレコードを追加したいということなのでしょうか? 通常はこのような仕様にはしないと思いますが、もしそうだとすれば、DataGridView1.CurrentRow.IsNewRowのようにして新規行かどうか判断ができますから、そこで列が全て空白(未入力)のレコードを追加することができると思います。
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年9月9日 15:24
    モデレータ

すべての返信

  • EndEdit()を実行してみて下さい。

    DataGridView.EndEdit メソッド
    http://msdn.microsoft.com/ja-jp/library/system.windows.forms.datagridview.endedit(VS.80).aspx
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年9月9日 8:25
    モデレータ
  • お返事ありがとうございます。
    やって見ました。

    using System;
    using System.Windows.Forms;
    namespace XML {
        public partial class Form1:Form {
            public Form1() {
                InitializeComponent();
            }
            private void dataGridView1_DefaultValuesNeeded(object sender,DataGridViewRowEventArgs e) {
                dataGridView1.EndEdit();
            }
            private void dataGridView1_SelectionChanged(object sender,EventArgs e) {
                dataGridView1.EndEdit();
            }
            private void dataGridView1_CellEnter(object sender,DataGridViewCellEventArgs e) {
                dataGridView1.EndEdit();
            }
        }
    }
    

    これは末尾のセルを選択したときはもちろん通常の選択でも確定します。
    通常のセルでは処理されないのは分かります。
    しかし末尾行でも追加されることはありません。
    それは末尾行に移動しただけでは"編集"しているわけではないからです。
    末尾行に移動したときに追加したいのです。
    2009年9月9日 8:53
  • こんな?

    public class Form1 : Form
    {
        public  Form1()
        {
            DataTable dt = new DataTable();
            DataColumn col1 = new DataColumn("", typeof(int));
            col1.Unique = true;
            col1.AutoIncrement = true;
            col1.AutoIncrementSeed = 0;
            col1.AutoIncrementStep = 1;
            col1.ReadOnly = false;
    
            dt.Columns.Add(col1);
            dt.Columns.Add();
    
            DataGridView dgv = new DataGridView();
            dgv.Dock = DockStyle.Fill;
            dgv.SelectionChanged += DataGridView_SelectionChanged;
    
            dgv.DataSource = new BindingSource(dt, null);
            this.Controls.Add(dgv);
        }
    
        private int rowIndexOld = -1;
    
        private void DataGridView_SelectionChanged(object sender, EventArgs e)
        {
            DataGridView grid = (DataGridView)sender;
            if (grid.CurrentCell != null)
            {
                int rowIndexNew = grid.CurrentCell.RowIndex;
                if ((rowIndexOld != rowIndexNew) && (rowIndexNew == grid.RowCount - 1))
                {
                    BindingSource source = (BindingSource)grid.DataSource;
                    object pos = source.Current;
                    source.CurrencyManager.EndCurrentEdit();//確定
                    source.Position = source.IndexOf(pos); //DatagridViewがソートされていると確定で並べ替えされて行がずれるので一致させる
                }
                rowIndexOld = rowIndexNew;
            }
        }
    }


    2009年9月9日 9:09
  • 末尾行に移動したときに追加したいのです。

    噛み合っていないようで、すみません。末尾行に移動した時点で、列が全て空白(未入力)のレコードを追加したいということなのでしょうか? 通常はこのような仕様にはしないと思いますが、もしそうだとすれば、DataGridView1.CurrentRow.IsNewRowのようにして新規行かどうか判断ができますから、そこで列が全て空白(未入力)のレコードを追加することができると思います。
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年9月9日 15:24
    モデレータ
  • gekkaさん返信ありがとうございました。

    やってみたところ、まさに!希望する動作になりました。
    BindingSourceというのが核のようです。
    このクラスは今まで使ったことがありませんでした。
    調べたところDataSet以外のクラスの多彩なデータから一貫したインターフェースを提供したりリストの変更通知機能といったイベントを提供したりする機能であることが分かりました。
    今回の件はおかげで解決しましたが、このクラスを知ることが出来たのが最も大きな収穫でした。
    ありがとうございました。
    2009年9月10日 1:16
  • 列が全て空白(未入力)のレコードを追加したいということなのでしょうか? 

    既定値を入れて確定したいのです。
    確かにこのような仕様は通常ないのですが要望として出てきたのでどうしたものかと考えていました。
    2009年9月10日 1:18
  • こんにちは、フォーラムオペレーターの高橋春樹です。

    trapemiyaさん、gekkaさん、いつもお世話になってます。

    和和和さん、こんにちは。
    MSDNフォーラムのご利用有難うございます。

    希望する動作を実現出来てよかったです(^-^)
    今回、trapemiyaさんとgekkaさんから頂いた情報が、皆様にとって有用なアドバイスであると思いましたので、
    勝手ながら、回答マークを付けさせてもらいました。

    今後ともMSDNフォーラムを宜しくお願いします。


    マイクロソフト株式会社 フォーラム オペレーター 高橋春樹
    2009年9月17日 2:34