Ошибка Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции. Имя параметра: 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];`