Полагаю, вы слишком усложняете это.Ваш комментарий…
», но я не могу сначала найти способ проверить их существование» …
Трудно проверить, что-тосуществует, если «не существует»!И именно поэтому вы получите ошибку Out Of Range
, ЕСЛИ вы не проверяете эти «несуществующие» ячейки, окружающие ячейку.Очевидно, что любая краевая ячейка попадет в эту категорию.Например, для любой первой ячейки столбца она будет содержать три (3) «несуществующие» ячейки: вверху слева (TL), внизу слева (BL) и слева (L).То же самое относится и к последнему столбцу, TR, BR и R.
Учитывая, что эти ячейки выйдут за пределы допустимого диапазона, если мы попытаемся получить их значение ... важно проверить эти ячейки ивозвращать что-то вроде «OOR», означающее, что эта окружающая ячейка «не существует».
Я предлагаю простой метод, который берет строку строки и индекс col и возвращает список строк, показывающих значения окружающих ячеек.Для «несуществующих» ячеек строка «OOR» (вне диапазона) используется для представления несуществующих окружающих ячеек.
Чтобы упростить это, я предлагаю второй метод, который дает строку ииндекс столбца, он просто вернет значение ячейки.В этом методе тривиально убедиться, что данный индекс строки и столбца находится в диапазоне строк и столбцов сетки.Это может выглядеть примерно так:
private string GetCellValue(int row, int col) {
if (row >= 0 && row < dataGridView1.Rows.Count && col >= 0 && col < dataGridView1.Columns.Count) {
if (dataGridView1.Rows[row].Cells[col].Value != null)
return dataGridView1.Rows[row].Cells[col].Value.ToString();
else
return "null";
}
else {
return "OOR";
}
}
Сначала очевидные проверки;если индекс строки больше или равен 0, а индекс строки также меньше, чем общее количество строк в сетке.То же самое относится и к индексу столбца.Если или индекс строки, или индекс col не пройдут эти тесты… мы знаем, что это «несуществующая» ячейка, и просто возвращаем что-то вроде «OOR».Если индексы строки и столбца верны, то мы просто возвращаем значение ячеек, очевидно, проверяя наличие пустых ячеек, таких как новая строка.
Учитывая этот метод, довольно легко получить окружающие значения любой ячейки всетки.Ниже List<string>
используется для сбора значений окружающих ячеек.При заданном индексе строки и столбца ячеек будет возвращен список строк, так что каждая строка будет содержать список окружающих ячеек, Пример для верхней левой ячейки «TL-> значение ячейки», «TR-> значение ячейки», «T->значение вызова »… и т. д. Это означает, что нам нужно вызывать метод более восьми (8) раз, один раз для TL, TR, T, B, L, R, BL, BR.Добавление возвращенной строки в список окружающих ячеек.Это может выглядеть примерно так:
private List<string> GetSurroundingCells(int row, int col) {
List<string> surroundingCells = new List<string>();
surroundingCells.Add("T->" + GetCellValue(row - 1, col));
surroundingCells.Add("TL->" + GetCellValue(row - 1, col - 1));
surroundingCells.Add("TR->" + GetCellValue(row - 1, col + 1));
surroundingCells.Add("B->" + GetCellValue(row + 1, col));
surroundingCells.Add("BL->" + GetCellValue(row + 1, col - 1));
surroundingCells.Add("BR->" + GetCellValue(row + 1, col + 1));
surroundingCells.Add("L->" + GetCellValue(row, col - 1));
surroundingCells.Add("R->" + GetCellValue(row, col + 1));
return surroundingCells;
}
Для тестирования DataGridView
с тремя (3) текстовыми столбцами и многострочным TextBox
помещается в форму.Событие grids SelectionChanged
связано и при запуске использует сетки CurrentCell
, чтобы вывести значение окружающих ячеек в текстовое поле.Надеюсь, это поможет.
private void Form1_Load(object sender, EventArgs e) {
for (int i = 0; i < 10; i++) {
dataGridView1.Rows.Add("C0R" + i, "C1R" + i, "C2R" + i);
}
}
private void dataGridView1_SelectionChanged(object sender, EventArgs e) {
int row = dataGridView1.CurrentCell.RowIndex;
int col = dataGridView1.CurrentCell.ColumnIndex;
List<string> surroundingCellsList = GetSurroundingCells(row, col);
textBox1.Text = "--- Cell a row: " + row + " col: " + col + " Value: " + GetCellValue(row, col) + Environment.NewLine;
foreach (string item in surroundingCellsList) {
textBox1.Text += item + Environment.NewLine;
}