Я использую GridView для отображения данных из базы данных, и у меня проблема с PageIndex, нумерация страниц работает правильно, я вижу всю информацию, но у меня проблема с кнопкой, расположенной в конце каждой строки, действие которой удалить строку
В представлении «Сетка» кнопка работает абсолютно нормально на первой странице, действие по удалению строки работает нормально, но когда я перехожу на вторую страницу
Exception thrown: 'System.ArgumentOutOfRangeException' in mscorlib.dll ("Index was out of range. Must be non-negative and less than the size of the collection.")
Проблема в том, что размер страницы для моего GridView установлен на 10, поэтому на первой странице строки устанавливаются (очевидно, как массив) от 0 до 9, но когда я перехожу на вторую страницу, массив продолжается с 10 до 19, поэтому, если я нажму кнопку в первой строке второй страницы, CommandArgument вернет «10»
(что переводится в 11 элементов массива) и больше, чем размер страницы gridview
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView1.PageIndex = e.NewPageIndex;
FillGrid();
}
public void FillGrid()
{
Methods metodos = new Methods();
string query = "SELECT * FROM ul";
GridView1.DataSource = metodos.Query(query);
GridView1.DataBind();
}
Ошибка происходит здесь
if (e.CommandName == "btnDelete")
{
int index = Convert.ToInt32(e.CommandArgument);
//Get row number
GridViewRow row = GridView1.Rows[index];
}
Индекс переменной возвращает 10, и возникает ошибка, потому что это значение (11 элементов в массиве) больше, чем размер страницы сетки, и он не «находит» строку, как говорит ошибка less than the size of the collection
Я попытался установить GridView1.PageIndex = 0; но разбиение на страницы перестает работать, если поместить привязку данных после установки GridView1.PageIndex = e.NewPageIndex; нумерация страниц снова перестает работать
Обновлено: это кнопка на сетке
<asp:Button runat = "server" Text = "Delete CommandName = "btnDelete" CommandArgument = "<%# Container.DataItemIndex %>" CausesValidation = "false"/>
Использовали ли вы настраиваемый шаблон подкачки? Рассмотрите возможность установки атрибута CommandArgument следующим образом: CommandArgument='<%#((GridViewRow)Container).RowIndex %>'. Лучше показать там разметку кнопки удаления.
@TetsuyaYamamoto извините, я отредактировал вопрос с кодом кнопки
Возможный дубликат Как создать кнопку удаления в GridView?





Проблема, кажется, исходит из определения свойства CommandArgument ниже:
CommandArgument = "<%# Container.DataItemIndex %>"
Согласно ссылке, DataItemIndex возвращает значение независимо от текущего номера страницы, а индексы коллекции Rows зависят от настройки PageSize, которая никогда не превышает ограничение на размер страницы, поэтому ArgumentOutOfRangeException будет выброшено при доступе к коллекции Rows с соответствующим индексом.
Простой обходной путь для этой проблемы — использование операции по модулю из PageSize свойства сетки против CommandArgument и использование его значения в качестве индекса строки:
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "btnDelete")
{
int index = (Convert.ToInt32(e.CommandArgument)) % GridView1.PageSize;
//Get row number
GridViewRow row = GridView1.Rows[index];
}
}
Ссылка:
GridViewRow.DataItemIndex (документы MS)
Аналогичная проблема:
«Индекс был вне допустимого диапазона» при доступе к коллекции DataKeys в Paged GridView
Как у вас дела с удалением? Обычно можно передать идентификатор записи обратно в команду и использовать его (а не индекс) для удаления.