【问题标题】:how to check if datagridview cell content value is typed manually/modified如何检查是否手动输入/修改了datagridview单元格内容值
【发布时间】:2017-04-24 11:45:35
【问题描述】:

在 datagridview 中,当我编辑单元格的内容并进行一些更改时,我想验证我输入的每个字符。 我很困惑,哪个事件适合这个。我尝试了 cellvaluechanged 事件。但它只发生在 第一次单击单元格时。但我想验证每次我在单元格内输入。请告诉 我哪个活动适合这个。

我尝试了什么:

private void dataGridView1_CellValueChanged(object sender, 
DataGridViewCellEventArgs e){
if(dataGridView1.Columns[e.ColumnIndex].Name == "Reference")
{
//My code goes here
 }
}

【问题讨论】:

  • _CellValueChanged 事件处理程序中放置一个断点,更改一些值并查看它是否达到断点,在我看来,每次更改值时它肯定会达到断点然后重新定义/优化您的条件。
  • 是否可以更具体地说明您想要进行哪种验证?内置功能可以在用户键入时完成单元格验证或格式化用户输入。目前尚不清楚您要验证的确切内容。
  • 例如,一种允许单元格中只允许数字字符的可能方法,然后您可以连接EditingControlShowing 事件以捕获正在编辑单元格时。从那里您可以检查正在编辑的单元格是否在您只想允许数字输入的列中(例如第 1 列),然后在EditingControlShowing 内连接另一个事件方法,例如“Column1_KeyPress”。从那里你可以处理用户输入的字符,在这个例子中......忽略任何不是数字的字符。

标签: c# .net winforms events datagridview


【解决方案1】:

我确实发现 DGV 中的事件很难调试,因为它们并不总是在您期望的时候触发。有时它们会在将值输入单元格之前或之后触发,并且在您的示例中只发生一次。

我解决这个问题的方法是操纵下面的事件 _CurrentCellDirtyState():

Private Sub datagridview1_CurrentCellDirtyStateChanged(sender As Object, e As EventArgs) _
    Handles datagridview1.CurrentCellDirtyStateChanged
    if datagridview1.IsCurrentCellDirty
        datagridview1.CommitEdit(DataGridViewDataErrorContexts.Commit)
    End If
End Sub

这会提交一个脏单元格(在按键上)。您现在可以在每个输入上捕获事件 _CellValueChanged() 中的更改。下面的示例在更改的单元格值上启用保存按钮。

Private Sub datagridview1_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) _
    Handles datagridview1.CellValueChanged
    btnSave.Enabled = true
End Sub

但是,如果您想执行验证,我建议您按照以下链接中的示例进行操作。

Make a specific column only accept numeric value in datagridview in Keypress event

您可以在 _KeyPress() 事件中构建自己的验证。我的大部分数据网格视图都同时使用了这两种方法。

【讨论】:

    猜你喜欢
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    相关资源
    最近更新 更多