C#中dataGridView的网格输入框内实时监控输入的值,需要两个事件一起用,对提示框也进行避免重复提示,和图标显示

 /// <summary>
        /// 输入格式的限制
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dataGridView3Editing(object sender, DataGridViewEditingControlShowingEventArgs e)
       {
            //检测是被表示的控件还是DataGridViewTextBoxEditingControl     
            if (e.Control is DataGridViewTextBoxEditingControl)
            {                DataGridView dgv = (DataGridView)sender;
                //取得被表示的控件             
                DataGridViewTextBoxEditingControl tb = (DataGridViewTextBoxEditingControl)e.Control;                   //事件处理器删除                tb.KeyPress -= new KeyPressEventHandler(dataGridViewTextBox_KeyPress);                  
                if (dgv.CurrentCell.OwningColumn.Name == "date3")
                {                    // KeyPress事件处理器追加     
                    tb.KeyPress += new KeyPressEventHandler(dataGridViewTextBox_KeyPress);
                }
            }
        }
        /// <summary>
        /// 对输入键盘的监控
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dataGridViewTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            if ((int)e.KeyChar >= 48 & (int)e.KeyChar <= 57 | (int)e.KeyChar == 8)//| (int)e.KeyChar == 46  .符号
            {
                e.Handled = false;
            } else {
                messgeNum = messgeNum + 1;//此处避免在输入一次提示三次的信息框
                if (messgeNum == 1)
                {
                MessageBox.Show("请输入正确的整数", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Error);//!
                }
                else if(messgeNum == 3)
                {
                    messgeNum = 0;
                }
                e.Handled = true;
            }
        }
 

参考了解决实时更新计算列的问题的文章

 

private void dgv_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    //判断当前单元格是否存在未提交的更改,只有存在才继续。
    //此判断有必要,因为下面的dgv.CommitEdit也会触发该事件,但此时IsCurrentCellDirty已为false,
    //如果不做判断,将会重复进入,造成无谓消耗
    if (dgv.IsCurrentCellDirty)
    {
        //将单元格值提交给数据源,dgv.EndEdit()也能做到提交,但那样会使单元格结束编辑状态
        //而dgv.CommitEdit()则会保持编辑状态
        //参数是提供给DataError等事件的原因
        dgv.CommitEdit(DataGridViewDataErrorContexts.Commit);
        
        //人工结束源行的编辑状态。只有这样,源行的计算列才会更新
        (dgv.CurrentRow.DataBoundItem as DataRowView).EndEdit();
        
        //或者执行DataRow的EndEdit()也能达到同样目的
        //(dgv.CurrentRow.DataBoundItem as DataRowView).Row.EndEdit();
    }
String stt = dataGridView1.CurrentCell.Value.ToString();
}

这里的stt就能取到实时输入的值了。

 当你输入的值要实时制空或者 赋值,也同时实时统计数据可能需要用到

 (dataGridView1.CurrentRow.DataBoundItem as DataRowView).Row.BeginEdit(); 当前行开始编辑

 if (dataGridView1.IsCurrentCellDirty)
            {
                dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
            }

进行可在编辑的提交

如果在某种情况下需要赋值,制空等

  (dataGridView1.CurrentRow.DataBoundItem as DataRowView).Row.EndEdit();//人工结束当前行编辑

调用这个,这样制空后还能再原来的单元格进行输入值

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值