Как проверить, пуста ли выбранная строка в datagridview (не имеет элемента) C#

Как бы я проверил, есть ли в ячейках строки данные, т. е. не пустые/null.

Я пробовал следующее:

        if (dgvClient.SelectedRows.Count > 0)
        {
            DataGridViewRow currentRow = dgvClient.SelectedRows[0];
            if (currentRow.Cells.ToString() != String.Empty)
            {
                //The code that will be here will open a form
            }
            else
            {
                MessageBox.Show("Select a non null row");
            }
        }

однако, похоже, он не работает, и у меня нет идей:/

Спасибо за любую помощь, Ари!--2-->

5 ответов


.Cells это коллекция DataGridViewCell объекты.

вам нужно перебрать эту коллекцию и проверить каждую ячейку, чтобы узнать, имеет ли она значение...

if (currentRow.Cells.Count > 0) 
{      
    bool rowIsEmpty = true;    

    foreach(DataGridViewCell cell in currentRow.Cells)    
    {
       if(cell.Value != null) 
       { 
           rowIsEmpty = false;
           break;
       }    
    }

   if(rowIsEmpty)
       MessageBox.Show("Select a non null row"); 
   else
       //DoStuff
}

другой способ проверить, выбрана ли новая пустая строка, возможно

if(dataGridView.CurrentRow.Index == dataGridView.Rows.Count -1)
{
    //you selected a new row
}

         for (int i = 0; i < dataGridView1.Rows.Count; i++)
            {
                for (int j = 0; j < dataGridView1.Columns.Count; j++)
                {
                    DataGridViewCell cell = dataGridView1[j, i];
                    object value = cell.Value;
                    if (value == string.Empty)
                    {
                             //do
                    }
                }
            }

Я думаю, что это можно сделать, обработав DataGridView.Событие RowEnter. Событие RowEnter происходит, когда строка получает фокус ввода, но до того, как она станет текущей строкой. Например, перемещение из одной ячейки в другую в другой строке.

проверьте каждое значение ячейки:

 void dataGridView1_RowEnter(object sender, DataGridViewCellEventArgs e)
 {
     dataGridView1.Rows[e.RowIndex].ReadOnly = checkrow(dataGridView1.Rows[e.RowIndex]);
 }

 bool checkrow(DataGridViewRow testrow)
 {
        for (int i = 0; i < testrow.Cells.Count; i++)
        {
            if (testrow.Cells[i].Value != null)
            {
                // if datagridview is databound, you'd better check whether the cell value is string.Empty
                if (testrow.Cells[i].Value.ToString() != string.Empty)
                {
                    // if value of any cell is not null, this row need to be readonly
                    return true;
                }

                // if there is an unbound checkbox column, you may need to check whether the cell value is null or false(uncheck).
            }
        }

        // else false
        return false;
 }

удивлен нет ответа linq, так что вот он:

if (dataGridView1.Rows.Cast<DataGridViewRow>()
      .Any(x => x.Cells.Cast<DataGridViewCell>()
      .Any(c => c.Value != null)))

строки DataGrid имеют тип DataCollection, который реализует IEnumerable. Вам просто нужно бросить ячейки и строки.