Member 14914297 Ответов: 2

Индекс был вне досягаемости. Должно быть неотрицательным и меньше размера коллекции.


could please help me to find a solution?
I am trying to fill in the flowlayoutpanel1 with 9 items associated with an  event.  I'm using next and previous buttons to navigate through it, but when I click the previous button I face index was out of range problem with clicking one of the items as well flowlayoutpanel1 decreased to 6 items:


Что я уже пробовал:

private void frmelection_Load(object sender, EventArgs e)
       {
           Cards = new List<Candidate>();
           btnprevious.Enabled = false;
           
           var cand = cancontroller.GetAllCandidates();
           if (cand.Count() <= 9)
           {
               btnnext.Enabled = false;
           }
           foreach (var i in cand)
           {
               Cards.Add(new Candidate{
                   ID=i.ID,
                   name=i.name,
                   candidatepic=i.candidatepic,
                   logoID=i.logoID
               });             
           }
   
           for (int i = 0; i < 9; i++)
           {
               //Check if Cards Has the Index
   
               if (Cards.Count - 1 < i)
                   break;
               indexer++;
               Candpanel c = new Candpanel();
               c.Controls.Add(addlblID(Cards[i].ID));
               c.Controls.Add(addlblName(Cards[i].name));
               c.Controls.Add(addpic(Cards[i]));
               flowLayoutPanel1.Controls.Add(c);
               c.DoubleClick += new EventHandler((s, ee) => this.CandpanelDoubleClick(s, e, Cards[i]));
           }
       }

       private void btnprevious_Click(object sender, EventArgs e)
       {
           FLPContainer.Controls.Clear();
           btnnext.Enabled = true;
           var index = indexer - 9;
   
           try
           {
               for (int i = index; i >= 0; i--)
               {
                   //Check if Cards Has the Index
                   if (Cards.Count - 1 < i)
                       break;
   
                   // Preventing User From Going Forward Case the List is Back Default
                   if (i == 9)
                       btnprevious.Enabled = false;
   
                   indexer++;
                   var c = new Candpanel();
                   c.Controls.Add(addlblID(Cards[i].ID));
                   c.Controls.Add(addlblName(Cards[i].name));
                   c.Controls.Add(addpic(Cards[i]));
                   c.DoubleClick += new EventHandler((s, ee) => this.CandpanelDoubleClick(s, e, Cards[i]));
                   flowLayoutPanel1.Controls.Add(c);
               }
           }
           catch
           {
               return;
           }
       }

Luc Pattyn

 
          catch
           {
               return;
           }

игнорировать подобные исключения - ужасная идея. Они дают первый ключ к разгадке, когда все идет ужасно неправильно, поэтому всегда убедитесь, что вы их видите.

Richard MacCutchan

Кроме того, вы используете жестко закодированный лимит цикла в 9, но используете карты.Считайте, чтобы вырваться из петли. Используйте только карты.Считайте, так как это единственное, что гарантированно будет точным.

2 Ответов

Рейтинг:
2

Sandeep Mewara

Ссылка: Класс IndexOutOfRangeException (System) | Microsoft Docs[^]

Цитата:
Исключение, возникающее при попытке получить доступ к элементу массива или коллекции с индексом, находящимся за его пределами.


С помощью логики Yu next/previous вам нужно убедиться, что в любой данный момент времени значение i всегда находится между 0-8 (как вы уже сказали, есть 9 пунктов).

Я предполагаю, что если вы используете отладчик в своей IDE, то обнаружите, что всякий раз, когда значение выходит за пределы диапазона 0-8 (либо -1, либо 9), оно выдает ошибку.


Рейтинг:
1

OriginalGriff

Мы не можем помочь вам напрямую с этим: это требует как ваших данных - которых у нас нет - так и вашего кода, работающего, чтобы исправить это, и мы не можем запустить этот код изолированно!.

Так что все будет зависеть от тебя.
имя вашей IDE и "отладчик" должны дать вам необходимую информацию.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Если вы не знаете, как его использовать, то быстрый Google для "Visual Studio debugger" должен дать вам необходимую информацию.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!