Ошибка Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции. Имя параметра: index

Загружаю в dataGridView2 таблицу из Excel, на её основе по определённым формулам создаются новые значения для заполнения dataGridView3. Всё работает нормально до одного момента: на строке tablistsa2[row][0] = tablitsa1[row][0] возникает ошибка: "Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции. Имя параметра: index". Не понимаю, что не так, укажите пожалуйста мои ошибки, желательно с пояснением. Если я все не так, как нужно, в задании написал, сильно не ругайтесь. =))

Заранее спасибо! Вот код:

`public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        DataTable dTable;
        OdbcConnection odbcConnection;

        public static double E = 0;
        public static double A = 0;

        public static List<List<double>> tablitsa1 = new List<List<double>>();
        public static List<double> tablitsa1Row = new List<double>();


        public static List<List<double>> tablistsa2 = new List<List<double>>();
        public static List<double> tablitsa2Row = new List<double>();

        private string fileName = string.Empty;

        private DataTableCollection tableCollection = null;


        private void открытьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                DialogResult resObshSofd = openFileDialog1.ShowDialog();

                if (resObshSofd == DialogResult.OK)
                {
                    fileName = openFileDialog1.FileName; //записываем сюда путь к открытому файлу

                    Text = fileName;

                    OpenExcelFile(fileName);


                }
                else
                {
                    throw new Exception("Файл не выбран!");// Выбрасываем ошибку в блок кэтч
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void OpenExcelFile(string path)
        {
            FileStream stream = File.Open(path, FileMode.Open, FileAccess.Read);
            IExcelDataReader reader = ExcelReaderFactory.CreateReader(stream);// после этого создаём бд
            DataSet db = reader.AsDataSet(new ExcelDataSetConfiguration()
            { 
                ConfigureDataTable = (x) => new ExcelDataTableConfiguration()
                {
                    UseHeaderRow = true// нужен для того, чтобы считывать верхнюю строку, в  которой написано название колонок и отображать её в датагридвью
                }
            });

            tableCollection = db.Tables;

            toolStripComboBox1.Items.Clear();

            foreach (DataTable tabe in tableCollection) // составляем список листов, которые может перебирать пользователь
            {
                toolStripComboBox1.Items.Add(tabe.TableName);
            }

            toolStripComboBox1.SelectedIndex = 0;
        }

        private void toolStripComboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            DataTable table = tableCollection[Convert.ToString(toolStripComboBox1.SelectedItem)];

            dataGridView2.DataSource = table; //задаём выбранную таблицу для отображения
        }

        private void button11_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "Image|*.png";
            // проверка открытия изображения
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    pictureBox3.Image = new Bitmap(ofd.FileName);
                }
                catch
                {
                    MessageBox.Show("Невозможно открыть выбранный файл", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }

        }

        private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                E = Convert.ToDouble(textBox1.Text.Replace('.', ','));
                A = Convert.ToDouble(textBox2.Text.Replace('.', ','));
            }
            catch (System.FormatException)
            {
                MessageBox.Show("Данные введены некорректно. Пожалуйста, " +
                    "введите корректное значение (значение должно быть десятичной дробью)",
                    "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            if (E < 0 || E > 1)
            {
                textBox1.Focus();
                textBox1.Select(0, textBox1.Text.Length);
                MessageBox.Show("Значение коэффициента экспоненциального сглаживания должно быть от 0 до 1");
                return;
            }
        }

        private void ShowTable(string ExcelQuery)
        {
            dTable.Rows.Clear();
            dTable.Columns.Clear();
            dTable.Dispose();
            OdbcDataAdapter adapter = new OdbcDataAdapter(ExcelQuery, odbcConnection);
            adapter.Fill(dTable);

            dataGridView2.Rows.Clear();
            dataGridView2.Columns.Clear();
            tablitsa1.Clear();
            tablitsa1Row.Clear();
            Marki.Clear();

            for (int column = 0; column < dTable.Columns.Count; column++)
            {
                string ColName = dTable.Columns[column].ColumnName;
                dataGridView2.Columns.Add(ColName, ColName);
            }

            for (int row = 0; row < dTable.Rows.Count; row++)
            {
                dataGridView2.Rows.Add(dTable.Rows[row].ItemArray);

                tablitsa1Row = new List<double>();
                Marki1St = new List<int>();

                for (int column = 0; column < dataGridView2.Columns.Count; column++)
                {
                    tablitsa1Row.Add(Convert.ToDouble(dataGridView2.Rows[row].Cells[column].Value));
                    Marki1St.Add(0);
                }

                tablitsa1.Add(tablitsa1Row);
                Marki.Add(Marki1St);
            }


        }

        private void dobavlenieStroki(object sender, EventArgs e)
        {
            dataGridView2.Rows.Add();
            tablitsa1Row = new List<double>();
            Random randomValue = new Random();
            int lastAddedRow = dataGridView2.Rows.Count - 1;
            for (int column = 1; column < dataGridView2.Columns.Count; column++)
            {
                double newValue = tablitsa1[0][column] + Math.Round(-1 * formuli.srednee(column, dataGridView2)
                    + randomValue.NextDouble() * (formuli.srednee(column, dataGridView2) * 1 - formuli.srednee(column, dataGridView2) * -1), 4);

                dataGridView2.Rows[lastAddedRow].Cells[column].Value = newValue;
                dataGridView2.Rows[lastAddedRow].Cells[0].Value = lastAddedRow;
            }

            for (int column = 0; column < dataGridView2.Columns.Count; column++)
                tablitsa1Row.Add(Convert.ToDouble(dataGridView2.Rows[lastAddedRow].Cells[column].Value));

            tablitsa1.Add(tablitsa1Row);
        }
        private void Draw(int index)
        {
            int lastRow = dataGridView3.RowCount - 1;

            chart1.Series["График фазовых координат блока " + index].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Spline;
            chart1.Series["График прогнозов блока " + index].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Spline;
            chart1.Series["График нижней границы блока " + index].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Spline;
            chart1.Series["График верхней границы блока " + index].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Spline;

            for (int row = 0; row < dataGridView2.Rows.Count; row++)
            {
                chart1.Series["График фазовых координат блока " + index].Points.AddXY(dataGridViews[index - 1].Rows[row].Cells[1].Value, dataGridViews[index - 1].Rows[row].Cells[2].Value);
                chart1.Series["График нижней границы блока " + index].Points.AddXY(dataGridViews[index - 1].Rows[row].Cells[5].Value, dataGridViews[index - 1].Rows[row].Cells[7].Value);
                chart1.Series["График верхней границы блока " + index].Points.AddXY(dataGridViews[index - 1].Rows[row].Cells[6].Value, dataGridViews[index - 1].Rows[row].Cells[8].Value);
                chart1.Series["График фазовых координат блока " + index].Points[row].Label = row.ToString();
                chart1.Series["График верхней границы блока " + index].Points[row].Label = row.ToString();
                chart1.Series["График нижней границы блока " + index].Points[row].Label = row.ToString();
            }

            chart1.Series["График прогнозов блока " + index].Points.AddXY(dataGridViews[index - 1].Rows[0].Cells[3].Value, dataGridViews[index - 1].Rows[0].Cells[4].Value);
            chart1.Series["График прогнозов блока " + index].Points[0].Label = "0";

            for (int row = 1; row < dataGridView2.Rows.Count; row++)
            {
                chart1.Series["График прогнозов блока " + index].Points.AddXY(dataGridViews[index - 1].Rows[row].Cells[3].Value, dataGridViews[index - 1].Rows[row].Cells[4].Value);
                chart1.Series["График прогнозов блока " + index].Points[row].Label = row.ToString();
            }

            chart1.Series["График прогнозов блока " + index].Points.AddXY(dataGridViews[index - 1].Rows[lastRow].Cells[3].Value, dataGridViews[index - 1].Rows[lastRow].Cells[4].Value);
            chart1.Series["График прогнозов блока " + index].Points[lastRow].Label = lastRow.ToString();
            chart1.Series["График прогнозов блока " + index].Points[lastRow].MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Triangle;
            chart1.Series["График прогнозов блока " + index].Points[lastRow].Color = Color.DeepPink;
            chart1.Series["График прогнозов блока " + index].Points[lastRow].MarkerSize = 20;
            chart1.Series["График прогнозов блока " + index].Points[lastRow].MarkerColor = Color.DeepPink;

            chart1.Series["График нижней границы блока " + index].Points.AddXY(dataGridViews[index - 1].Rows[lastRow].Cells[5].Value, dataGridViews[index - 1].Rows[lastRow].Cells[4].Value);
            chart1.Series["График нижней границы блока " + index].Points[lastRow].Label = lastRow.ToString();
            chart1.Series["График нижней границы блока " + index].Points[lastRow].MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Triangle;
            chart1.Series["График нижней границы блока " + index].Points[lastRow].Color = Color.DeepPink;
            chart1.Series["График нижней границы блока " + index].Points[lastRow].MarkerSize = 20;
            chart1.Series["График нижней границы блока " + index].Points[lastRow].MarkerColor = Color.DeepPink;

            chart1.Series["График верхней границы блока " + index].Points.AddXY(dataGridViews[index - 1].Rows[lastRow].Cells[6].Value, dataGridViews[index - 1].Rows[lastRow].Cells[4].Value);
            chart1.Series["График верхней границы блока " + index].Points[lastRow].Label = lastRow.ToString();
            chart1.Series["График верхней границы блока " + index].Points[lastRow].MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Triangle;
            chart1.Series["График верхней границы блока " + index].Points[lastRow].Color = Color.DeepPink;
            chart1.Series["График верхней границы блока " + index].Points[lastRow].MarkerSize = 20;
            chart1.Series["График верхней границы блока " + index].Points[lastRow].MarkerColor = Color.DeepPink;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            chart1.Visible = true;
            dataGridView3.Rows.Clear();
            dataGridView3.Columns.Clear();
            tablistsa2.Clear();
            chart1.Series["График фазовых координат"].Points.Clear();
            chart1.Series["График прогнозов"].Points.Clear();
            chart1.Series["График нижней границы"].Points.Clear();
            chart1.Series["График верхней границы"].Points.Clear();

            dataGridView3.Columns.Add("Эпоха", "Эпоха");
            dataGridView3.Columns.Add("M", "M");
            dataGridView3.Columns.Add("Альфа", "α (в секундах)");
            dataGridView3.Columns.Add("M", "M прогнозное");
            dataGridView3.Columns.Add("Альфа", "α прогнозное");
            dataGridView3.Columns.Add("M-", "M-");
            dataGridView3.Columns.Add("M+", "M+");
            dataGridView3.Columns.Add("Альфа-", "α- (в секундах)");
            dataGridView3.Columns.Add("Альфа+", "α+ (в секундах)");
            dataGridView3.Columns.Add("L", "L");
            dataGridView3.Columns.Add("D", "D");
            dataGridView3.Columns.Add("Устойчивость", "Устойчивость");
            dataGridView3.Columns.Add("м-прогнозоное", "м-прогнозное");
            dataGridView3.Columns.Add("м+прогнозоное", "м+прогнозное");

            for (int row = 0; row < dataGridView2.Rows.Count; row++)
            {
                dataGridView3.Rows.Add();
                tablitsa2Row = new List<double>();

                for (int column = 0; column < dataGridView3.Columns.Count + 2; column++)
                    tablitsa2Row.Add(0);
                tablistsa2.Add(tablitsa2Row);

                tablistsa2[row][0] = tablitsa1[row][0];
                dataGridView3.Rows[row].Cells[0].Value = tablistsa2[row][0];`

Ответы (0 шт):