Я думаю, ArgumentOutOfRangeException
произошло, потому что вы не устанавливаете свойство атрибута DataKeyNames
в сетке, следовательно, индекс строки все еще находится за пределами границ при вызове e.RowIndex
. Вы должны установить для него имя столбца идентификатора / первичного ключа следующим образом:
DataKeyNames="[ID or PK column name]"
Вот пример использования:
<asp:GridView ID="GridView1" runat="server" DataKeyNames="id"
AutoGenerateColumns="False" CellPadding="4" ForeColor="#333333" GridLines="None"
Width="1650px" AutoGenerateDeleteButton="True" OnRowDeleting="GridView1_RowDeleting">
</asp:GridView>
Обновление 1
Кроме того, я обнаружил несоответствие имени параметра в этом запросе:
string query = "DELETE FROM mainpage WHERE id=@ID";
NpgsqlCommand cmd = new NpgsqlCommand(query, cn);
cmd.Parameters.Add("@ID2", NpgsqlDbType.Integer).Value = ID2;
Правильный вариант должен быть таким, как пример ниже:
string query = "DELETE FROM mainpage WHERE id=@ID";
NpgsqlCommand cmd = new NpgsqlCommand(query, cn);
cmd.Parameters.Add("@ID", NpgsqlDbType.Integer).Value = ID2;
Ссылка: Свойство GridView.DataKeyNames