DataGridView, recorre todas las filas y multiplica si existe

Hola a todos, necesito ayuda.

Estoy haciendo una especie de juego de "Juego de la vida". De todos modos, quiero verificar usando la vista de cuadrícula, si el vecino de la celda actual tiene el mismo valor que mi celda actual. Si es así, quiero verificar si hay espacio vacío (alrededor de la celda actual) y agregar el valor del vecino pero con un carácter adicional.

Aquí está mi código:

public void check()
{
  Textual txt = new Textual();
  for (int x = 0; x < dataGridView1.Rows.Count; x++)
  {
    for (int y = 0; y < dataGridView1.Rows[x].Cells.Count; y++)
    {
        if (dataGridView1.Rows[x].Cells[y].Value == "VS" ||
            dataGridView1.Rows[x].Cells[y].Value == "SL" ||
            dataGridView1.Rows[x].Cells[y].Value == "KG" ||
            dataGridView1.Rows[x].Cells[y].Value == "KN")
        {
          if (y - 1 >= 0 &&
              y + 1 < dataGridView1.ColumnCount &&
              x - 1 >= 0 && x + 1 < dataGridView1.RowCount &&
              y + 1 < dataGridView1.ColumnCount &&
              x + 1 < dataGridView1.RowCount)
          {
            string value = dataGridView1.Rows[x].Cells[y].Value.ToString();
            int j;
            int k;
            switch (value)
            {
              case "VS":
              if (dataGridView1.Rows[x].Cells[y + 1].Value == "")
              {
                dataGridView1.Rows[x].Cells[y + 1].Value = "VS++";
                j = x;
                k = y + 1;
                int[,] temp= new int[j, k];
                or.oznaka = "VS";
                popis.TryAdd(temp, or);
                dataGridView1.Rows[x].Cells[y + 1].Style.BackColor = System.Drawing.Color.Red;
              }
              else if (dataGridView1.Rows[x - 1].Cells[y].Value == "")
              {
                dataGridView1.Rows[x - 1].Cells[y].Value = "VS++";
                j = x - 1;
                k = y;
                int[,] temp= new int[j, k];
                or.oznaka = "VS";
                popis.TryAdd(temp, or);
                dataGridView1.Rows[x - 1].Cells[y].Style.BackColor = System.Drawing.Color.Yellow;
              }
              else if (dataGridView1.Rows[x + 1].Cells[y].Value == "")
              {
                dataGridView1.Rows[x + 1].Cells[y].Value = "VS++";
                j = x + 1;
                k = y;
                int[,] temp= new int[j, k];
                or.oznaka = "VS";
                popis.TryAdd(temp, or);
                dataGridView1.Rows[x + 1].Cells[y].Style.BackColor = System.Drawing.Color.Gold;
              }
              else if (dataGridView1.Rows[x + 1].Cells[y + 1].Value == "")
              {
                dataGridView1.Rows[x + 1].Cells[y + 1].Value = "VS+";
                j = x - 1;
                k = y + 1;
                int[,] temp= new int[j, k];
                or.oznaka = "VS";
                popis.TryAdd(temp, or);
                dataGridView1.Rows[x + 1].Cells[y + 1].Style.BackColor = System.Drawing.Color.Green;
              }
              else if (dataGridView1.Rows[x - 1].Cells[y - 1].Value == "")
              {
                dataGridView1.Rows[x - 1].Cells[y - 1].Value = "VS+";
                j = x - 1;
                k = y - 1;
                int[,] temp= new int[j, k];
                or.oznaka = "VS";
                popis.TryAdd(temp,or);
                dataGridView1.Rows[x - 1].Cells[y - 1].Style.BackColor = System.Drawing.Color.Purple;
              }
              else if (dataGridView1.Rows[x - 1].Cells[y + 1].Value == "")
              {
                dataGridView1.Rows[x - 1].Cells[y + 1].Value = "VS+";
                j = x - 1;
                k = y + 1;
                int[,] temp= new int[j, k];
                or.oznaka = "VS";
                popis.TryAdd(temp, or);
                dataGridView1.Rows[x - 1].Cells[y + 1].Style.BackColor = System.Drawing.Color.HotPink;
              }
              else if (dataGridView1.Rows[x].Cells[y - 1].Value == "")
              {
                dataGridView1.Rows[x].Cells[y - 1].Value = "VS+";
                j = x;
                k = y - 1;
                int[,] temp= new int[j, k];
                or.oznaka = "VS";
                popis.TryAdd(temp, or);
                dataGridView1.Rows[x].Cells[y - 1].Style.BackColor = System.Drawing.Color.Lavender;
              }
              else if (dataGridView1.Rows[x + 1].Cells[y - 1].Value == "")
              {
                dataGridView1.Rows[x + 1].Cells[y - 1].Value = "VS+";
                j = x + 1;
                k = y - 1;
                int[,] temp= new int[j, k];
                or.oznaka = "VS";
                popis.TryAdd(temp, or);
                dataGridView1.Rows[x + 1].Cells[y - 1].Style.BackColor = System.Drawing.Color.LightBlue;
              }
              break;
            }
          }
        }
      }
    }
  }

preguntado el 09 de marzo de 12 a las 13:03

Lo siento, no está claro cuál es tu pregunta. -

Así que intentaré ser más claro. Tengo rejilla. Por ejemplo, el objeto está encendido (5,5) Necesito verificar las ocho direcciones a su alrededor y ver si algún objeto tiene el mismo valor que mi objeto actual, si lo tiene, entonces necesito verificar mi primer objeto (5,5) si tiene un espacio vacío e inserta algún valor -

Actualice su pregunta en lugar de aclarar en un comentario. Cuando haga eso, también publique solo los fragmentos de código relevantes (y sangra ese código de manera razonable). -

Sugerencia: Divida su problema en dos: Primero, resuelva su problema con una matriz simple (¡sin control de GUI involucrado!). Luego resuelva el problema de actualizar un DataGridView (o algunos otros controles de la interfaz de usuario) para que refleje el estado de la matriz. Sugiero esto porque todo eso DataGridEl código relacionado distrae la atención de lo que realmente está sucediendo, y actualizar la GUI suele ser trivial si ya tiene una buena fuente de datos de respaldo. -

(@denonth, pero Killercam tiene razón. Felicitaciones a @Scott M. por haber trabajado duro. Ya sabes, si quieres ayuda, ¡sería útil que les hicieras esto fácil a los demás! En lugar de eso, has hecho una pregunta mal explicada y Espere que la gente lea una tonelada de código mal formateado. No pretendemos castigarlo con palabras; tome esto como un consejo sobre cómo hacer preguntas aquí, de una manera que garantice que recibirá rápidamente respuestas útiles). -

1 Respuestas

Aquí hay una función que puede usar para encontrar vecinos coincidentes. Seguirá siendo muy similar si opta por una matriz bidimensional en lugar de una cuadrícula, que sería la mejor solución, ya que los controles deben usarse para la interacción con humanos y los datos deben manipularse independientemente de la presentación.

Para encontrar el valor coincidente dado una celda (tenga en cuenta xey: cambió el significado habitual de ellos):

cell = FindCell(new Point(x, y), dataGridView1.Rows[y].Cells[x]);

Y para encontrar una celda vacía:

cell = FindCell(new Point(x, y), string.Empty);

EDITAR: mejor ejemplo de uso

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";
                }
            }
        }
    }
}

EDITAR 2: Supuse de su código que sus celdas tendrán un valor no nulo. Como no es así, reemplace cada cell.Value.ToString () con (cell.Value ?? string.Empty) .ToString (), como hice en el ejemplo.

Haga una prueba de nulo después para asegurarse de haber encontrado una celda. Aquí está la función:

/// <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;
}

respondido 09 mar '12, 15:03

este es un muy buen ejemplo, lo que necesito es algo que determine la misma celda alrededor de un objeto. Y luego encuentre un espacio vacío y rellénelo con algún valor. El espacio vacío debe estar alrededor de los primeros objetos. - usuario123_456

Creo que necesito dentro de esto: if (cell.Value.ToString() == value) { return cell; } inserte algún código que rodee el objeto e inserte si hay espacio vacío disponible. - usuario123_456

Eso es exactamente eso. A medida que se desplaza por las celdas, llame a esta función para averiguar si tiene un vecino que contenga el mismo valor; use el mismo enfoque para encontrar una celda vacía. Editaré mi publicación para que quede más clara. - Nikola Markovinovic

Supuse de su código que sus celdas tendrán un valor no nulo. Como no es así, reemplace cada cell.Value.ToString () con (cell.Value ?? string.Empty) .ToString (), como hice en el ejemplo. - Nikola Markovinovic

Porque los espacios vacíos encuentran otros espacios vacíos alrededor. Para solucionarlo, agregue una verificación de celdas vacías antes de la primera llamada a FindCell. - Nikola Markovinovic

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.