Jordan Nash Ответов: 1

Добавление элементов в конец представления списка


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.
КОНЕЦ, ЕСЛИ ЕЩЕ
КОНЕЦ.
=====================
Да, я знаю, что это совсем не похоже на то, что я написал в своем коде. :(

1 Ответов

Рейтинг:
2

OriginalGriff

Самое простое решение-не использовать массив: вместо него используйте список:
List<string> temp = новый список<string>);
Список<строка> У arryFilePaths = новый список<строка&ГТ;);
Затем вы можете сделать это:

   temp.Add(single_file);
...
arryFilePaths.Add(single_file);
И эта система будет обрабатывать все это для вас за кулисами.

Кстати, ListView.Коллекция элементов также имеет метод AddRange, поэтому этот код:
for (int i = 0; i < _counter; i++)
                {                    
                    //DISPLAY filename and image from image index param. 
                    lstImages.Items.Add(arryFilePaths[i], i);
                }
Может быть сделано в одном заявлении:
lstImages.Items.AddRange(arryFilePaths);


Jordan Nash

Привет,
К сожалению, у меня возникли проблемы с компиляцией вашего кода. Не могли бы вы показать его полностью с циклами и операторами if, если это уместно в данной ситуации. Наконец, извините, но ваше использование метода AddRange, похоже, не работает, так как он не принимает список строк.