Индекс страницы GridView - PullRequest
       5

Индекс страницы GridView

0 голосов
/ 13 февраля 2019

Я использую 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»

debug result of command argument

(что переводится в элемент 11 намассив), и он больше, чем размер страницы вида сетки

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"/>

1 Ответ

0 голосов
/ 13 февраля 2019

Проблема возникает из определения свойства 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 Docs)

Аналогичная проблема:

«Индекс был вне диапазона» при доступе к коллекции DataKeys в Paged GridView

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...