在整个 dataGridView 完全填充 C# 中的有效值之前,我们如何禁用常规按钮

How can we make a regular button disabled until the entire dataGridView is completely filled with valid values in C#

我有一个 datagridview,其中包括一些验证,例如单元格值不为空和单元格值应在 (1,9) 的范围内。我还想确保仅在整个 datagridview 填充有效值后才启用计算按钮。

我尝试使用 foreach 并检查其中的行和单元格(如果单元格值不为空),但在检查一个单元格后按钮立即启用。检查每行中的最后一个单元格也不起作用,因为用户可以按任何顺序填充值,我们应该尝试跟踪所有单元格都被填充的时间点,然后启用按钮。如果没有填满,我们必须立即禁用该按钮。有没有一种方法可以仅在所有单元格都已填充并相应验证后才启用按钮。

下面是我的代码。我对 C# 有点陌生,我也想知道我是否使用正确的 datagridview 事件来实现这一点。除了循环遍历每一行和单元格来查找值,是否有一种有效的方法来一次性查找所有单元格是否已填充?

Cal.Enabled = false;
private void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
            int r = e.RowIndex;
            int c = e.ColumnIndex;
foreach (DataGridViewRow row in dataGridView.Rows)
            {
                foreach (DataGridViewCell cell in row.Cells)
                {
                    if ((cell.Value != null) || cell.Value != DBNull.Value || !(String.IsNullOrEmpty(cell.Value.ToString())))
                    {
                        Cal.Enabled = true;
                    }
                }

            }
        }

您需要在您的条件下使用 "AND" 而不是 "OR"。 尝试

if ((cell.Value != null) && cell.Value != DBNull.Value && !(String.IsNullOrEmpty(cell.Value.ToString())))
                    {
                        Cal.Enabled = true;
                    }

您必须检查每个单元格 - 如果有任何 一个 单元格无效,您必须禁用该按钮。

顺便说一句,我认为当您使用 CellEndEdit 事件而不是 Validating 事件时,行为会更好。但这两种工作。

private void dataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{   
    // We assume every cell is valid
    // and then we'll loop until we find one that isn't.    
    var allValid = true; 
    foreach (DataGridViewRow row in dataGridView.Rows)
    {
        foreach (DataGridViewCell cell in row.Cells)
        {
            var v = cell.Value;         
            if(v == null || v == DBNull.Value || string.IsNullOrEmpty(v?.ToString())) {
                // We found an invalid cell!
                allValid = false;
                break;
            }           
        }       
        // a cell in this row was invalid - no need to check the next row
        if(!allValid) break;            
    }

    // Now, if all cells were valid, allValid is still true.
    // If any cell was invalid, it's false. 
    Cal.Enabled = allValid;
}