Index-1 does not have a value

This seems to be some kind of internal binding bug in .NET. I experienced exactly the same exception whenever using DataGridView bound to a List. I really spent a lot of time trying to find a solution and I've finally managed to get rid of these exceptions today - by adding ICurrencyManagerProvider interface to all my Lists. This interface only has a "CurrencyManager" read-only property and a "GetRelatedCurrencyManager" method. I'm just returning Nothing in both of them and that's it, no more CurrencyManager "index -1 does not have a value" stuff.

EDIT: OK, just found out the "proper way" is actually to use BindingList(of T) class instead of List(of T)


Update

Modify the dgvClients_CellClick method to include more checks:

 if (e.ColumnIndex == 0) //delete button has been clicked
            {
                if (e.RowIndex >= 0)
                {
                    DataGridViewRow dataGridViewRow = dataGridView1.Rows[e.RowIndex];

                    if (dataGridViewRow.Cells.Count > 1)
                    {
                        DeleteClient(dataGridViewRow.Cells[e.ColumnIndex + 1].FormattedValue.ToString());
                    }
                }
                else
                {
                    LogToFile(e.RowIndex.ToString());
                }
            }

You could modify the check in dgvClients_CellClick to include e.RowIndex > 0 which should prevent the exception. Other than that, to know the exact reason for the behavior we would have to look at the add item logic and may be also the clientList.

May be you have to set the selected row index after you add items manually.