Добавление элементов в конец представления списка
IndexOutOfBoundsException "индекс находился за пределами массива."
Это происходит, когда я пытаюсь добавить другой элемент в listview. Похоже, что когда мы добавляем новый элемент, размер массива сбрасывается до того, что мы к нему добавили. Таким образом, размер счетчика становится больше, чем массив. Пожалуйста, скажи мне, что я сделал не так! Ошибка находится в этой строке
temp[_counter] = single_file;в способе
loadImageList()
Вот мой код.
public partial class Form1 : Form { string _big_fileName; int _counter = 0; int _imageIndex; #region Initializers public Form1() { InitializeComponent(); } //Displays larger instance of selected image in picture box. private void lstImages_SelectedIndexChanged(object sender, EventArgs e) { //FOR i is less than the first image. for (int i = 0; i < lstImages.SelectedItems.Count; i++) { //GET filename from listview and store in index. _big_fileName = lstImages.SelectedItems[i].Text; //Create larger instance of image. pictureBox1.Image = Image.FromFile(_big_fileName); //Fill panel to the width and height of picture box. panel1.AutoScrollMinSize = new Size(pictureBox1.Image.Width, pictureBox1.Image.Height); _imageIndex = lstImages.SelectedIndices[0]; loadImageMetaData(); } } private void mnuOpen_Click(object sender, EventArgs e) { loadImageList(); _imageIndex = 0; } private void loadImageList() { imageList1.Images.Clear(); lstImages.Clear(); oFD1.InitialDirectory = "C:\\"; oFD1.Title = "Open an Image File"; oFD1.Filter = "JPEGS|*.jpg|GIFS|*.gif|PNGS|*.png|BMPS|*.bmp"; //Open Dialog Box. var oldResults = oFD1.ShowDialog(); if (oldResults == DialogResult.Cancel) { return; } try { //GET amount of filenames. int num_of_files = oFD1.FileNames.Length; //Temp array i created to solve the error. string[] temp = new string[num_of_files]; //Store filenames in string array. string[] arryFilePaths = new string[num_of_files]; //FOREACH filename in the file. foreach (string single_file in oFD1.FileNames) { //IF there are more images I want to display. if (_counter >= oFD1.FileNames.Length) { //Append and render those images to the end of the image list. temp[_counter] = single_file; imageList1.Images.Add(Image.FromFile(single_file)); _counter++; break; } //ACCESS array using _counter to find file. arryFilePaths[_counter] = single_file; //CREATE image in memory and add image to image list. imageList1.Images.Add(Image.FromFile(single_file)); _counter++; } //BIND image list to listview. lstImages.LargeImageList = imageList1; for (int i = 0; i < _counter; i++) { //DISPLAY filename and image from image index param. lstImages.Items.Add(arryFilePaths[i], i); } } catch (Exception ex) { Debug.WriteLine("Error " + ex.Message); } } private void lstImages_DoubleClick(object sender, EventArgs e) { lstImages = abb.abbListview.Update(lstImages, "Form Header", lstImages.SelectedIndices[0]); } } }
Что я уже пробовал:
Шаг 1
Я попытался изменить эту линию
string[] arryFilePaths = новая строка[num_of_files];
к
string[] arryFilePaths = новая строка[num_of_files + _counter];
Я безнадежно кодировал здесь наугад, это просто переопределяет все, что находится в массиве, и избавляется от предыдущих элементов.
Шаг 2
Я воспользовался этим. Он должен быть в моем
lstImages_DoubleClickсобытие.
Обновление Элементов Списка[^]
Шаг 3
Написал псевдокод.
=====================
НАЧАЛО
Получить счетчик
Получите ArryTotalFiles.
Объявите ньюарри.
Если (ArryTotalFiles не пуст).
Храните внутри tempArray ArrayTotalFiles и подсчитывайте.
КОНЕЦ, ЕСЛИ
Остальное, если (tempArry не пустой)
Очистите ArrTotalFiles.
Храните в StringFileArray ArryTotalFiles и Count.
КОНЕЦ, ЕСЛИ ЕЩЕ
КОНЕЦ.
=====================
Да, я знаю, что это совсем не похоже на то, что я написал в своем коде. :(