Вот функция, которую вы можете использовать, чтобы найти подходящих соседей.Это все равно будет очень похоже, если вы выберете двумерный массив вместо сетки, что было бы лучшим решением, поскольку элементы управления должны использоваться для взаимодействия с людьми, а данные должны обрабатываться независимо от представления.
Чтобы найтизначение, соответствующее ячейке (помните, х и у - вы изменили их обычное значение):
cell = FindCell(new Point(x, y), dataGridView1.Rows[y].Cells[x]);
И найти пустую ячейку:
cell = FindCell(new Point(x, y), string.Empty);
РЕДАКТИРОВАТЬ: лучший пример использования
foreach (DataGridViewRow row in dataGridView1.Rows)
{
foreach (DataGridViewCell cell in row.Cells)
{
if (cell.Value != null && cell.Value.ToString() != string.Empty)
{
DataGridViewCell neighbour = FindCell(new Point(cell.ColumnIndex, row.Index), cell.Value.ToString());
// Found
if (neighbour != null)
{
DataGridViewCell emptyCell = FindCell(new Point(cell.ColumnIndex, row.Index), string.Empty);
if (emptyCell != null)
{
emptyCell.Value = "WHATEVERYOUREQUIREITTOBE";
}
}
}
}
}
РЕДАКТИРОВАТЬ 2: Я предполагал, что из вашего кода ваши ячейки будут иметь ненулевое значение.Как это не так, замените каждый cell.Value.ToString () на (cell.Value ?? string.Empty) .ToString (), как я делал в примере.
Проверьте на нулевое значение после, чтобы убедиться, чтоВы нашли камеру.Вот функция:
/// <summary>
/// List of locations around given location. Add to previous value to get next location.
/// </summary>
Point[] neighbours = new Point[]
{
new Point (-1, -1),
new Point (1, 0),
new Point (1, 0),
new Point (-2, 1),
new Point (2, 0),
new Point (-2, 1),
new Point (1, 0),
new Point (1, 0),
};
/// <summary>
/// Finds a cell containing given string value.
/// </summary>
/// <param name="location">Point of search</param>
/// <param name="value">Value to find</param>
/// <returns>Cell containing given value</returns>
DataGridViewCell FindCell(Point location, string value)
{
for (int i = 0; i < neighbours.Length; ++i)
{
// Move location to new point
location.Offset(neighbours[i]);
// Check boundaries
if (location.Y >= 0 && location.Y < dataGridView1.RowCount
&& location.X >= 0 && location.X < dataGridView1.Columns.Count)
{
// Get cell
DataGridViewCell cell = dataGridView1.Rows[location.Y].Cells[location.X];
// If value matches
if ((cell.Value ?? string.Empty).ToString() == value)
{
return cell;
}
}
}
// No match
return null;
}