datagridview单元格输入内容触发事件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了datagridview单元格输入内容触发事件相关的知识,希望对你有一定的参考价值。

RT,如何让输入时触发事件,不要失去焦点以后触发事件,像text的textchanged事件
现在能在输入内容的时候触发了,但是获取到的值是0

参考技术A 有个 CellValueChange事件追问

那也是在单元格不可编辑的状态下触发,我要的是只要单元格内容发生变化的时候就进行触发

参考技术B EditingControlShowing这个事件你试过了吗追问

试过了,这个也是单元格失去编辑状态下才触发的,我要像文本框的textchange那样,只要内容发生改变就触发

追答

private void Return_DGV_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)

if (Return_DGV.CurrentCell.ColumnIndex.Equals(7))//判断是否是要触发的那个单元格

TextBox txtAmount = e.Control as TextBox;//先把那个单元格转化成文本框
txtAmount.TextChanged += new EventHandler(txtAmount_TextChanged);//写一个txt_TextChanged()事件,这里面做你的逻辑处理


void txtAmount_TextChanged(object sender, EventArgs e)

//这里写

这个应该就是你想要的了

追问

能触发了,但是获取到的值都是0,单元格不失去编辑状态下就无法获取到输入的值。。。有解决办法吗

追答

不会啊 我之前的项目有用到这方面的 值都能获取到
你调试看看 是哪部分有问题

追问

调试了一下就是因为单元格还没失去焦点所以获取到的值是0,如果单元格失去焦点的话就能获取到值了

追答

能把你代码给我看下吗 不会啊 我这里是判断数量的 如果我输入的不是数字 就直接提示我输入错误了 不会说是要等到失去焦点啊

追问

文字超出限制了,放图片吧

方便加下 Q 吗

追答

这没失去焦点吧,第一个单元格 但是最后一个也能获取到他们三个相加的值了啊

 private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
       
            if(dataGridView1.CurrentCell.ColumnIndex.Equals(0))
           
                TextBox txtAmount = e.Control as TextBox;
                txtAmount.TextChanged += new EventHandler(txtAmount_TextChanged);
           
       
        //
        void txtAmount_TextChanged(object sender, EventArgs e)
       
            DataGridViewRow row = dataGridView1.CurrentRow;
            //Decimal amountCell = 0m;//
            TextBox txt = sender as TextBox;
            int a = Convert.ToInt32(dataGridView1.CurrentRow.Cells[0].EditedFormattedValue);
            int b = Convert.ToInt32(dataGridView1.CurrentRow.Cells[1].EditedFormattedValue);
            int c = Convert.ToInt32(dataGridView1.CurrentRow.Cells[2].EditedFormattedValue);
            dataGridView1.CurrentRow.Cells[3].Value = a + b + c;
           
       

本回答被提问者采纳
参考技术C 你可以试试cell失去焦点的事件,。。。。追问

我不要失去焦点,我要在没失去焦点的情况下就触发事件

如何验证 DataGridView 中单元格编辑控件的输入?

【中文标题】如何验证 DataGridView 中单元格编辑控件的输入?【英文标题】:How can I validate input to the edit control of a cell in a DataGridView? 【发布时间】:2011-02-08 17:10:43 【问题描述】:

看来,在 DataGridView 控件的单元格中捕获按键事件以在用户键入时验证用户输入的唯一方法是使用 DataGridView 控件的 OnEditControlShowing 事件,将方法连接到编辑控件的(e .Control) 按键事件并进行一些验证。

我的问题是我构建了一堆自定义 DataGridView 列类,它们有自己的自定义单元格类型。这些单元格有自己的自定义编辑控件(例如 DateTimePickers 和 Numeric 或 Currency 文本框。)

我想对那些以货币数字文本框作为编辑控件但不是所有其他单元格类型的单元格进行数字验证。

如何在 DataGridView 的“OnEditControlShowing”覆盖中确定特定的编辑控件是否需要一些数字验证?

【问题讨论】:

【参考方案1】:

如果我正确理解您的问题,您想选择基于编辑控件的类型连接事件。如果是这样,我会这样做:

    private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    
        //Remove any KeyPress events already attached
        e.Control.KeyPress -= new KeyPressEventHandler(FirstEditingControl_KeyPress);
        e.Control.KeyPress -= new KeyPressEventHandler(SecondEditingControl_KeyPress);

        //Choose event to wire based on control type
        if (e.Control is NumericTextBox)
        
            e.Control.KeyPress += new KeyPressEventHandler(FirstEditingControl_KeyPress);
         else if (e.Control is CurrencyTextBox)
        
            e.Control.KeyPress += new KeyPressEventHandler(SecondEditingControl_KeyPress);
        
    

我从经验中了解到,在 DataGridView 中编辑控件时取消连接任何可能的事件,因为它们将为多个单元格重用相同的控件。

【讨论】:

我也这么认为,但似乎编辑控件的类型总是 DataGridViewTextBoxEditingControl??

以上是关于datagridview单元格输入内容触发事件的主要内容,如果未能解决你的问题,请参考以下文章

向上和向下键未触发 datagridview 单元格中的按键事件文本框

c# datagridview 单个 单元格的样式(即字号或者字体颜色)发生改变时候,触发啥事件???

关于C#中 对于datagridview 单击任意一个单元格,获取那一行数据的语句

编辑datagridview单元格

在 DataGridView 中触发复选框值更改事件

如何验证 DataGridView 中单元格编辑控件的输入?