Как мы можем сделать обычную кнопку отключенной, пока весь dataGridView не будет полностью заполнен действительными значениями в C# - PullRequest
2 голосов
/ 04 марта 2020

У меня есть datagridview, для которого я включил пару проверок, например, значение ячейки не пусто, и значение ячейки должно быть в диапазоне (1,9). Я также хотел убедиться, что кнопка вычисления включена только после того, как весь datagridview заполнен действительными значениями.

Я пытался использовать foreach и проверять строки и ячейки внутри него, если значение ячейки не пустое, но кнопка включается сразу после проверки одной ячейки. Проверка последней ячейки в каждой строке также не работает, поскольку пользователь может заполнять значения в любом порядке, и мы должны попытаться отследить точку, когда все ячейки заполнены, и сделать кнопку включенной. Если они не заполнены, мы должны немедленно отключить кнопку. Есть ли способ, которым я могу включить кнопку, только если все ячейки заполнены и проверены соответственно.

Ниже мой код. Я немного новичок в C#, я также хотел знать, использую ли я правильное событие datagridview для достижения этой цели. Вместо того, чтобы циклически проходить по каждой строке и ячейке, чтобы найти значение, существует ли эффективный способ узнать, заполнены ли все ячейки или нет - go?

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;
                    }
                }

            }
        }

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Вы должны проверить каждую ячейку - и если какая-либо одна ячейка недействительна, вы должны отключить кнопку.

Кроме того, я думаю, что поведение лучше, когда вы используете Событие 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;
}
0 голосов
/ 04 марта 2020

Вы должны использовать «И» в вашем состоянии вместо «ИЛИ». Попробуйте

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