Ошибка «Индекс был вне диапазона ...» - PullRequest
0 голосов
/ 29 февраля 2012

Я работаю над сайтом, на котором пользователи могут добавлять и удалять видео из списка.
Все добавление и удаление производится с помощью флажков. Я могу добавить несколько видео за раз, но когда я пытаюсь удалить более одного из них одновременно из списка, это дает мне эту ошибку:

Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index

Однако, если нет проблем с удалением по одному. Также, когда я получаю ошибку и возвращаюсь, проверенные видео исчезают.
Это в C # ASP.NET, и я не уверен, где ошибка, но я считаю, что это происходит в событии btnDeleteVideo_Click. Я показываю другое событие (btnAddVideo_Click) в качестве ссылки, если это необходимо. Я могу удалить это, если это поможет. Я новичок в stackoverflow, поэтому прошу прощения, если это слишком много или слишком мало информации.

Вот код для добавления и удаления событий:

protected void btnAddVideo_Click(object sender, EventArgs e)
{

    foreach (GridViewRow gvr in GridView3.Rows)
    {
        CheckBox chkItem = (CheckBox)gvr.FindControl("cbAdd");
        if (chkItem.Checked)

        {
            String sRecID = GridView3.DataKeys[gvr.RowIndex].Value.ToString();
            Session["videorecid"] = sRecID;
            SqlDataSource2.Insert();
            SqlDataSource2.SelectCommand = "SELECT * FROM dealervideo inner join videos on videos.RecID = dealervideo.VideoRecID inner join dealers on dealers.RecID = dealervideo.DealerRecID where dealers.RecID = " + hidRecID.Value;
            GridView2.DataBind();
        }
    }
    GridView2.DataBind();
}

protected void btnDeleteVideo_Click(object sender, EventArgs e)
{

    foreach (GridViewRow gvr in GridView2.Rows)
    {
        CheckBox chkItem = (CheckBox)gvr.FindControl("cbDelete");
        if (chkItem.Checked)
        {
            String sRecID = GridView2.DataKeys[gvr.RowIndex].Value.ToString();
            Session["videorecid"] = sRecID;
            SqlDataSource2.Delete();
            SqlDataSource2.SelectCommand = "SELECT * FROM dealervideo inner join videos on videos.RecID = dealervideo.VideoRecID inner join dealers on dealers.RecID = dealervideo.DealerRecID where dealers.RecID = " + hidRecID.Value;
            GridView2.DataBind();
        }
    }
}

Ответы [ 5 ]

2 голосов
/ 29 февраля 2012

Не вызывайте GridView2.DataBind(); внутри цикла foreach, сделайте это только один раз в конце (как вы уже делаете)

2 голосов
/ 29 февраля 2012

Проблема в логике btnDeleteVideo_Click.

Представьте, что в вашем списке 5 элементов, пронумерованных от 0 до 4, и вы пытаетесь удалить 2 сразу.

Ваш код выше теперь перебирает все пять строк. Когда он добирается до первого удаления, он удаляет строку, удаляя ее из источника данных и повторно связывая.

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

Таким образом, строка String sRecID = GridView2.DataKeys[gvr.RowIndex].Value.ToString(); будет иметь тенденцию взрываться, поскольку исходный индекс RowIndex теперь может превышать фактическое число строк.

Лучшим подходом было бы обработать все строки, которые вы хотите удалить, с помощью loopin, как вы, но только удалить и заново привязать в конце.

0 голосов
/ 29 февраля 2012

Вы повторно привязываете свою сетку после каждого удаления, что уменьшит количество строк на одну - удалите все и затем выполните повторную привязку.

0 голосов
/ 29 февраля 2012

я бы предложил переехать

SqlDataSource2.SelectCommand = "SELECT * FROM dealervideo inner join videos on videos.RecID = dealervideo.VideoRecID inner join dealers on dealers.RecID = dealervideo.DealerRecID where dealers.RecID = " + hidRecID.Value;
GridView2.DataBind();

за пределами вашего цикла foreach.

0 голосов
/ 29 февраля 2012

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

Эта строка:

String sRecID = GridView3.DataKeys [gvr.RowIndex] .Value.ToString (); Session ["videorecid"] = sRecID;

gvr.Rowindex попробуйте привести его к целому числу ... сначала

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