ifExists в ячейке DataGridView - PullRequest
       8

ifExists в ячейке DataGridView

0 голосов
/ 06 февраля 2019

У меня есть DataGridView, и я хочу перебрать все ячейки в DataGridView, фиксируя значения окружающих ячеек.Я получаю ожидаемые выходящие за границы ошибки на полях DataGridView, но я не могу сначала найти способ проверить их существование?

Ниже я сохраняю выбранное состояние окружающей ячейки в массиве bool.однако эта ячейка не существует, так как бы я проверил или обработал это?

neighbourCells[0] = dgv_Current.Rows[x-1].Cells[y].Selected;

Любая помощь с благодарностью.

1 Ответ

0 голосов
/ 10 февраля 2019

Полагаю, вы слишком усложняете это.Ваш комментарий…

», но я не могу сначала найти способ проверить их существование»

Трудно проверить, что-тосуществует, если «не существует»!И именно поэтому вы получите ошибку 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;
  }
...