【问题标题】:How to run Run CellEndEdit only when Cell ValueChanged in DataGridView如何仅在 DataGridView 中的 Cell ValueChanged 时运行 Run CellEndEdit
【发布时间】:2012-02-12 12:49:46
【问题描述】:

我只想在单元格的值改变时运行 CellEndEdit,尝试放置

if (dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString() == e.FormattedValue.ToString()) 
             return; 

在 CellValidation 事件中,Cell Validation 事件确实返回,但 CellEndEdit 也会执行并更新,updated dateby 字段当用户仅进入编辑模式并且未更改值单元格就出来了。
到达 CellEndEdit 时,CellValueFormatted Value 相同,因此无法将其放入 CellEndEdit。

一个简单的解决方案是在 CellValidation 中设置一个标志,并在设置标志时返回 CellEndEdit,但这似乎是一个容易出错的解决方案,因为表单上有大约 10 个网格。那么10个标志?

【问题讨论】:

    标签: c# .net winforms validation datagridview


    【解决方案1】:

    不要在 CellEndEdit 中执行您的任务,而是将它们放在 CellValueChanged 中。仅当单元格值更改时才会触发。请注意,最初填充 DataGridView 时它会触发,但要处理它,您可以只输入一个变量 formInitialized 或其他内容,以确保在填充数据网格时不会执行 CellEndEdit。

    为了回答您的问题,无法确定在触发 CellEndEdit 时值是否发生更改,因为它总是在单元格退出编辑模式时触发。唯一的解决方案是,就像您建议的那样,将旧值存储在外部,但您已经注意到为什么这么糟糕(尽管它在大多数情况下都非常有效)。

    【讨论】:

    • 好答案,为避免维护变量“formInitialized”,您可以在“this.InitializeComponent();”之后连接“CellValueChanged”事件在表单/控件构造函数中调用。这样你就不必维护变量了。
    【解决方案2】:

    但如果您想计算编辑的值,您可以使用 J.Fisher 建议的问题,例如:

    Private Sub dgvHost_CellBeginEdit(sender As Object, e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles dgvHost.CellBeginEdit
        dgvHost.CurrentCell.Tag = dgvHost.CurrentCell.Value
    End Sub
    
    Private Sub dgvHost_CellEndEdit(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvHost.CellEndEdit
        If dgvHost.CurrentCell.Tag = dgvHost.CurrentCell.Value Then Exit Sub
        dgvHost.CurrentCell.Tag = Nothing
        'Do something like
        dgvHost.CurrentCell.Value = MD5(dgvHost.CurrentCell.Value)
    End Sub
    

    【讨论】:

      【解决方案3】:

      您绝对可以通过捕获CellBeginEdit 中的当前单元格值,然后将其与CellEndEdit 中的当前单元格值进行比较来达到目标​​。 (或者使用你的 CellValidation 技巧。)

      为避免“多个标志”,您可以使用Dictionary<DataGridView,object>,这样您就可以使用当前事件的网格键入字典,然后获取或设置适当的值。

      【讨论】:

        【解决方案4】:
         MessageBox.Show(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString());
        

        【讨论】:

          【解决方案5】:

          我是这样设计的:

          C#:

          private void DynList_RowValidated(object sender, DataGridViewCellEventArgs e)
          {
              if (ChangedRow == true) {
                  ChangedRow = false;
                  //Row Changed...
              }
          
          }
          bool ChangedRow;
          private void DynList_CellValueChanged(object sender, DataGridViewCellEventArgs e)
          {
              ChangedRow = true;
          }
          

          VB.Net:

           Private Sub DynList_RowValidated(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs)
                  If ChangedRow = True Then
                      ChangedRow = False
                      'Row Changed...
                  End If
          
           End Sub
           Dim ChangedRow As Boolean
           Private Sub DynList_CellValueChanged(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs)
                  ChangedRow = True
           End Sub
          

          我尝试了大约 1 小时来存档这个,因为没有人对此有解决方案,所以我认为它可能对其他人有用

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-18
            • 2019-02-16
            相关资源
            最近更新 更多