2

我有一个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;
                    }
                }

            }
        }
4

2 回答 2

1

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

顺便说一句,我认为当你使用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;
}
于 2020-03-05T00:01:48.687 回答
0

您需要在您的情况下使用“AND”而不是“OR”。尝试

if ((cell.Value != null) && cell.Value != DBNull.Value && !(String.IsNullOrEmpty(cell.Value.ToString())))
                    {
                        Cal.Enabled = true;
                    }
于 2020-03-04T20:24:36.693 回答