none
DataGridView 编辑回车事件 RRS feed

  • 问题

  • 在DataGridView 单元格编辑状态时

    按回车时 判断这个单元格的内容是否确定

    如果正确光标进入下一行对应的列的单元格中

    如果不正确光标还是停留本单元格中

    2010年11月10日 1:54

答案

  • 你好 DataGridView控件默认是无法处理KeyPress的

    而开心的方法有一点没有考虑到 就是CEllEndEdit事件不一定由Enter建按了才发生,比如我直接把鼠标移动到新的行也会

    正确的做法是:

    新建一个类:

    namespace WindowsFormsApplication
    {
      public sealed class MyDataGridView : DataGridView
      {
    
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
          if (keyData == Keys.Enter)
          {
            this.OnKeyPress(new KeyPressEventArgs('r'));
            return true;
          }
          else
            return base.ProcessCmdKey(ref msg, keyData);
        }
      }
    }

    然后将这个控件拖到窗体中 添加KeyPress事件

    private void myDataGridView1_KeyPress(object sender, KeyPressEventArgs e)
        {
    
          if (e.KeyChar == 'r')
          {
            DataGridView dgv = sender as DataGridView;
            DataGridViewCell cell = dgv.CurrentCell;
            if (cell.IsInEditMode)
            {
              //限制单元格只能输入test 
              if (cell.EditedFormattedValue != null && cell.EditedFormattedValue.ToString() != "test")
              {
                MessageBox.Show("输入内容不合格");
              }
              else
              {
                dgv.CurrentCell = dgv[cell.ColumnIndex, cell.RowIndex + 1];
              }
            }
          }
        }

     


    Raymond Tang (Microsoft C# MVP)
    Denn Ich Gehoer nur mir
    .NET交流群71840452
    微软中文论坛同城社区成都QQ群:74268428
    My Chinese Blog
    Chengdu,Sichuan Province,China
    2010年11月10日 6:29
    版主
  • 如果 你还需要兼顾 不是按Enter键而是直接将鼠标移动到另外的cell 如果也需要检测的话就添加下面的代码到窗体中

    参考 http://hi.baidu.com/1987raymond/blog/item/3ae34789049232a30e244466.html

    private void myDataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
     {
      DataGridView dgv = sender as DataGridView;
      DataGridViewCell cell = dgv[e.ColumnIndex, e.RowIndex];
      {
      //限制单元格只能输入test 
      if (cell.EditedFormattedValue != null && cell.EditedFormattedValue.ToString() != "test")
      {
       MessageBox.Show("输入内容不合格");
    
    //补充一句这里最把cell记录下来 然后在selectionchanged事件中设置一次currentcell 不然这种情况下依然鼠标跳到了新的行 }
    else
    {
    dgv.CurrentCell = dgv[cell.ColumnIndex, cell.RowIndex + 1];
    }
    }
    }


    Raymond Tang (Microsoft C# MVP)
    Denn Ich Gehoer nur mir
    .NET交流群71840452
    微软中文论坛同城社区成都QQ群:74268428
    My Chinese Blog
    Chengdu,Sichuan Province,China
    2010年11月10日 6:49
    版主
  • dear

    需要兩個事件CellEndEdit、SelectionChanged

    1.由CellEndEdit事件判斷儲存格內的資料,是否吻合我們所需要的條件,若條件不符合則用_PreviousViewCell變數記錄錯誤的儲存格。

    2.使用SelectionChanged事件,不論滑鼠鍵盤點到哪裡,DataGridView將回到錯誤的儲存格編輯。

    請參考
    http://www.dotblogs.com.tw/yc421206/archive/2010/11/10/19345.aspx


    秘訣無它,唯勤而已
    2010年11月10日 11:40

全部回复

  • public bool isNext = false;
        private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
           DialogResult dr=MessageBox.Show("确定要改变吗?","",MessageBoxButtons.OKCancel);
           isNext = false;
           if (dr!=DialogResult.OK)
           {
             isNext = true;
           }
        }
    
        private void dataGridView1_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
        {
          if (isNext)
          {
            e.Cancel = true;
          }
        }
    

    http://blog.csdn.net/zx13525079024
    2010年11月10日 5:18
  • 你好 DataGridView控件默认是无法处理KeyPress的

    而开心的方法有一点没有考虑到 就是CEllEndEdit事件不一定由Enter建按了才发生,比如我直接把鼠标移动到新的行也会

    正确的做法是:

    新建一个类:

    namespace WindowsFormsApplication
    {
      public sealed class MyDataGridView : DataGridView
      {
    
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
          if (keyData == Keys.Enter)
          {
            this.OnKeyPress(new KeyPressEventArgs('r'));
            return true;
          }
          else
            return base.ProcessCmdKey(ref msg, keyData);
        }
      }
    }

    然后将这个控件拖到窗体中 添加KeyPress事件

    private void myDataGridView1_KeyPress(object sender, KeyPressEventArgs e)
        {
    
          if (e.KeyChar == 'r')
          {
            DataGridView dgv = sender as DataGridView;
            DataGridViewCell cell = dgv.CurrentCell;
            if (cell.IsInEditMode)
            {
              //限制单元格只能输入test 
              if (cell.EditedFormattedValue != null && cell.EditedFormattedValue.ToString() != "test")
              {
                MessageBox.Show("输入内容不合格");
              }
              else
              {
                dgv.CurrentCell = dgv[cell.ColumnIndex, cell.RowIndex + 1];
              }
            }
          }
        }

     


    Raymond Tang (Microsoft C# MVP)
    Denn Ich Gehoer nur mir
    .NET交流群71840452
    微软中文论坛同城社区成都QQ群:74268428
    My Chinese Blog
    Chengdu,Sichuan Province,China
    2010年11月10日 6:29
    版主
  • 如果 你还需要兼顾 不是按Enter键而是直接将鼠标移动到另外的cell 如果也需要检测的话就添加下面的代码到窗体中

    参考 http://hi.baidu.com/1987raymond/blog/item/3ae34789049232a30e244466.html

    private void myDataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
     {
      DataGridView dgv = sender as DataGridView;
      DataGridViewCell cell = dgv[e.ColumnIndex, e.RowIndex];
      {
      //限制单元格只能输入test 
      if (cell.EditedFormattedValue != null && cell.EditedFormattedValue.ToString() != "test")
      {
       MessageBox.Show("输入内容不合格");
    
    //补充一句这里最把cell记录下来 然后在selectionchanged事件中设置一次currentcell 不然这种情况下依然鼠标跳到了新的行 }
    else
    {
    dgv.CurrentCell = dgv[cell.ColumnIndex, cell.RowIndex + 1];
    }
    }
    }


    Raymond Tang (Microsoft C# MVP)
    Denn Ich Gehoer nur mir
    .NET交流群71840452
    微软中文论坛同城社区成都QQ群:74268428
    My Chinese Blog
    Chengdu,Sichuan Province,China
    2010年11月10日 6:49
    版主
  • dear

    需要兩個事件CellEndEdit、SelectionChanged

    1.由CellEndEdit事件判斷儲存格內的資料,是否吻合我們所需要的條件,若條件不符合則用_PreviousViewCell變數記錄錯誤的儲存格。

    2.使用SelectionChanged事件,不論滑鼠鍵盤點到哪裡,DataGridView將回到錯誤的儲存格編輯。

    請參考
    http://www.dotblogs.com.tw/yc421206/archive/2010/11/10/19345.aspx


    秘訣無它,唯勤而已
    2010年11月10日 11:40