En el desarrollo de aplicaciones de escritorio con Windows Forms, es muy común utilizar el control DataGridView para mostrar conjuntos de datos. Este potente control nos permite visualizar información en formato tabular, pero a menudo necesitamos interactuar con esos datos, por ejemplo, mostrar los detalles de una fila seleccionada en otros controles, como TextBox.

Si te has preguntado cómo lograr que al hacer clic en una fila de tu DataGridView, la información de esa fila aparezca automáticamente en cajas de texto separadas para su visualización o edición, estás en el lugar correcto. Aquí te explicaremos paso a paso cómo implementar esta funcionalidad de manera eficiente.

El proceso central para lograr esta tarea se basa en capturar el momento en que el usuario cambia la selección de fila en el DataGridView y, en ese instante, acceder a los datos de la fila recién seleccionada para luego asignarlos a los TextBoxes correspondientes.
- Capturando el Cambio de Selección: El Evento Clave
- Obteniendo la Fila Seleccionada
- Accediendo a los Datos de las Celdas por Índice de Columna
- Accediendo a los Datos de las Celdas por Nombre de Columna
- Consideraciones Adicionales y Manejo de Datos
- Tabla Comparativa: Acceso por Índice vs. Nombre
- Implementación Completa en el Evento SelectionChanged
- Preguntas Frecuentes
- Conclusión
Capturando el Cambio de Selección: El Evento Clave
La clave para reaccionar a la selección de una fila en el DataGridView es utilizar el evento adecuado. El evento ideal para esto es el evento SelectionChanged. Este evento se dispara cada vez que cambia la selección de una o más celdas en el control. Cuando la propiedad SelectionMode del DataGridView está configurada para seleccionar filas completas (como es lo más común para este escenario), este evento se activa cada vez que el usuario selecciona una fila diferente.
Al manejar el evento SelectionChanged, nos aseguramos de que nuestro código para actualizar los TextBoxes se ejecute precisamente cuando el usuario elige una nueva fila. Otros eventos, como CellClick o RowEnter, también podrían usarse, pero SelectionChanged es generalmente más robusto para manejar selecciones múltiples o cambios programáticos.
Obteniendo la Fila Seleccionada
Una vez que el evento SelectionChanged se dispara, el primer paso es identificar cuál es la fila que ha sido seleccionada por el usuario. El control DataGridView tiene una propiedad muy útil llamada CurrentRow. Esta propiedad devuelve un objeto DataGridViewRow que representa la fila actual que tiene el foco o que ha sido seleccionada (dependiendo del modo de selección y foco).
A partir del objeto CurrentRow, podemos obtener su posición dentro del DataGridView a través de la propiedad Index. El índice de la fila es un número entero que comienza desde 0 para la primera fila.
Veamos cómo obtener el índice de la fila seleccionada tanto en Visual Basic .NET como en C#:
En Visual Basic .NET:Dim filaActualIndex As Integer
If DataGridView1.CurrentRow IsNot Nothing Then
filaActualIndex = DataGridView1.CurrentRow.Index
' Ahora 'filaActualIndex' contiene el índice de la fila seleccionada
End If
En C#:int filaActualIndex;
if (dataGridView1.CurrentRow != null)
{
filaActualIndex = dataGridView1.CurrentRow.Index;
// Ahora 'filaActualIndex' contiene el índice de la fila seleccionada
}
Es importante incluir una verificación (IsNot Nothing en VB.NET o != null en C#) para asegurarse de que realmente hay una fila seleccionada antes de intentar acceder a su índice. Esto evita errores si el evento se dispara en un momento en que no hay ninguna fila activa.
Accediendo a los Datos de las Celdas por Índice de Columna
Una vez que tenemos el índice de la fila seleccionada, podemos acceder a los valores de las celdas individuales dentro de esa fila. Las celdas de una fila se acceden a través de la colección Cells de la fila. Esta colección es indexada, donde Cells(0) (o Cells[0] en C#) representa la primera columna, Cells(1) la segunda, y así sucesivamente.
Para obtener el valor de una celda específica, accedemos a la colección Cells de la fila seleccionada (usando su índice) y luego al índice de la columna deseada, y finalmente a la propiedad Value de la celda.
El valor retornado por la propiedad Value es de tipo Object, por lo que generalmente necesitaremos convertirlo a una cadena de texto (usando ToString()) para asignarlo a la propiedad Text de un TextBox.

Ejemplo de cómo obtener valores de las primeras dos columnas y asignarlos a TextBox1 y TextBox2:
En Visual Basic .NET:Dim filaActualIndex As Integer
If DataGridView1.CurrentRow IsNot Nothing Then
filaActualIndex = DataGridView1.CurrentRow.Index
' Obtener valor de la primera columna (índice 0)
If DataGridView1.Rows(filaActualIndex).Cells.Count > 0 Then
TextBox1.Text = DataGridView1.Rows(filaActualIndex).Cells(0).Value.ToString()
Else
TextBox1.Text = String.Empty ' O manejar como prefieras si no hay celda
End If
' Obtener valor de la segunda columna (índice 1)
If DataGridView1.Rows(filaActualIndex).Cells.Count > 1 Then
TextBox2.Text = DataGridView1.Rows(filaActualIndex).Cells(1).Value.ToString()
Else
TextBox2.Text = String.Empty ' O manejar como prefieras si no hay celda
End If
End If
En C#:int filaActualIndex;
if (dataGridView1.CurrentRow != null)
{
filaActualIndex = dataGridView1.CurrentRow.Index;
// Obtener valor de la primera columna (índice 0)
if (dataGridView1.Rows[filaActualIndex].Cells.Count > 0)
{
textBox1.Text = dataGridView1.Rows[filaActualIndex].Cells[0].Value.ToString();
}
else
{
textBox1.Text = string.Empty; // O manejar como prefieras si no hay celda
}
// Obtener valor de la segunda columna (índice 1)
if (dataGridView1.Rows[filaActualIndex].Cells.Count > 1)
{
textBox2.Text = dataGridView1.Rows[filaActualIndex].Cells[1].Value.ToString();
}
else
{
textBox2.Text = string.Empty; // O manejar como prefieras si no hay celda
}
}
Es buena práctica verificar que la colección Cells de la fila tenga suficientes elementos (columnas) antes de intentar acceder a un índice específico, para evitar errores si el DataGridView está vacío o las columnas no están configuradas como esperas.
Accediendo a los Datos de las Celdas por Nombre de Columna
Usar el índice numérico de la columna (0, 1, 2, etc.) funciona bien, pero tiene una desventaja: si el orden de las columnas en tu DataGridView cambia (ya sea por diseño o porque el usuario las reordena si lo permites), tu código dejará de funcionar correctamente, ya que estarás obteniendo el valor de la columna incorrecta.
Una forma más robusta de acceder a los valores de las celdas es utilizando el nombre de la columna. Cada columna en el DataGridView tiene un nombre (propiedad Name o DataPropertyName si está enlazada a datos). Podemos obtener el índice de una columna a partir de su nombre usando la colección Columns del DataGridView.
Primero obtenemos el índice de la columna por su nombre, y luego usamos ese índice para acceder a la celda, como hicimos antes. Esto hace que tu código sea independiente del orden visual de las columnas.
Ejemplo: Supongamos que quieres obtener el valor de la columna cuyo nombre interno es "CorreoDeUsuario".
En Visual Basic .NET:Dim filaActualIndex As Integer
If DataGridView1.CurrentRow IsNot Nothing Then
filaActualIndex = DataGridView1.CurrentRow.Index
' Obtener el índice de la columna por su nombre
Dim columnaCorreoIndex As Integer = -1
If DataGridView1.Columns.Contains("CorreoDeUsuario") Then
columnaCorreoIndex = DataGridView1.Columns("CorreoDeUsuario").Index
End If
' Si se encontró la columna, obtener su valor
If columnaCorreoIndex <> -1 AndAlso DataGridView1.Rows(filaActualIndex).Cells.Count > columnaCorreoIndex Then
TextBox3.Text = DataGridView1.Rows(filaActualIndex).Cells(columnaCorreoIndex).Value.ToString()
Else
TextBox3.Text = String.Empty ' Columna no encontrada o celda inexistente
End If
End If
En C#:int filaActualIndex;
if (dataGridView1.CurrentRow != null)
{
filaActualIndex = dataGridView1.CurrentRow.Index;
// Obtener el índice de la columna por su nombre
int columnaCorreoIndex = -1;
if (dataGridView1.Columns.Contains("CorreoDeUsuario"))
{
columnaCorreoIndex = dataGridView1.Columns["CorreoDeUsuario"].Index;
}
// Si se encontró la columna, obtener su valor
if (columnaCorreoIndex != -1 && dataGridView1.Rows[filaActualIndex].Cells.Count > columnaCorreoIndex)
{
textBox3.Text = dataGridView1.Rows[filaActualIndex].Cells[columnaCorreoIndex].Value.ToString();
}
else
{
textBox3.Text = string.Empty; // Columna no encontrada o celda inexistente
}
}
Nuevamente, incluimos verificaciones: primero, si la colección Columns contiene una columna con el nombre especificado, y luego, si el índice obtenido es válido y existe una celda en esa posición para la fila actual.
Consideraciones Adicionales y Manejo de Datos
Cuando obtienes el Value de una celda, este es de tipo Object. Aunque ToString() funciona para la mayoría de los casos y es necesario para asignarlo a un TextBox, debes tener en cuenta el tipo de dato real de la celda, especialmente si planeas usar ese dato para algo más que mostrarlo como texto (por ejemplo, realizar cálculos o comparaciones).
Si una celda contiene un valor nulo de base de datos (DBNull.Value), llamar a ToString() directamente sobre DBNull.Value lanzará una excepción. Es recomendable verificar si el valor de la celda es DBNull.Value antes de intentar convertirlo a cadena u otro tipo de dato. Si es DBNull.Value, puedes asignar una cadena vacía (String.Empty o "") al TextBox.
Ejemplo de manejo de DBNull.Value:
En Visual Basic .NET:' ... dentro del evento SelectionChanged ...
If DataGridView1.CurrentRow IsNot Nothing Then
Dim filaActualIndex = DataGridView1.CurrentRow.Index
Dim columnaIndex = 0 ' O el índice o nombre que necesites
If DataGridView1.Rows(filaActualIndex).Cells.Count > columnaIndex Then
Dim cellValue = DataGridView1.Rows(filaActualIndex).Cells(columnaIndex).Value
If cellValue IsNot Nothing AndAlso Not IsDBNull(cellValue) Then
TextBox1.Text = cellValue.ToString()
Else
TextBox1.Text = String.Empty ' La celda está vacía o es DBNull
End If
Else
TextBox1.Text = String.Empty ' No hay celda en ese índice
End If
End If
En C#:// ... dentro del evento SelectionChanged ...
if (dataGridView1.CurrentRow != null)
{
int filaActualIndex = dataGridView1.CurrentRow.Index;
int columnaIndex = 0; // O el índice o nombre que necesites
if (dataGridView1.Rows[filaActualIndex].Cells.Count > columnaIndex)
{
object cellValue = dataGridView1.Rows[filaActualIndex].Cells[columnaIndex].Value;
if (cellValue != null && cellValue != DBNull.Value)
{
textBox1.Text = cellValue.ToString();
}
else
{
textBox1.Text = string.Empty; // La celda está vacía o es DBNull
}
}
else
{
textBox1.Text = string.Empty; // No hay celda en ese índice
}
}
Tabla Comparativa: Acceso por Índice vs. Nombre
| Característica | Acceso por Índice (Cells(0), Cells[0]) | Acceso por Nombre (Columns("Nombre").Index) |
|---|---|---|
| Sintaxis | Más corta y directa una vez que tienes el índice. | Requiere un paso adicional para obtener el índice por nombre. |
| Robustez ante cambios de orden | No robusto. Rompe si el orden de las columnas cambia. | Robusto. Funciona independientemente del orden visual de las columnas. |
| Legibilidad del código | Menos legible; un número (ej. 3) no indica qué dato representa. | Más legible; el nombre de la columna (ej. "NombreCliente") indica claramente el dato. |
| Rendimiento | Ligeramente más rápido ya que accede directamente por posición. | Tiene una pequeña sobrecarga al buscar el índice por nombre, pero insignificante en la práctica para este uso. |
| Ideal para | Casos donde el orden de las columnas es fijo y conocido, o para iterar por todas las columnas. | Casos donde necesitas acceder a datos específicos sin importar la posición visual de la columna. |
En general, para acceder a datos específicos que quieres mostrar en TextBoxes, es altamente recomendable utilizar el acceso por nombre de columna debido a su robustez y legibilidad.

Implementación Completa en el Evento SelectionChanged
Para poner todo junto, debes seleccionar tu control DataGridView en el diseñador, ir a la ventana de propiedades, hacer clic en el icono de eventos (el rayo) y hacer doble clic en el evento SelectionChanged. Esto creará automáticamente el método manejador de eventos en tu código. Dentro de este método, colocarás la lógica que hemos descrito.
Ejemplo básico del código dentro del manejador del evento SelectionChanged:
En Visual Basic .NET:Private Sub DataGridView1_SelectionChanged(sender As Object, e As EventArgs) Handles DataGridView1.SelectionChanged
' Limpiar TextBoxes si no hay fila seleccionada (opcional pero recomendado)
If DataGridView1.CurrentRow Is Nothing Then
TextBox1.Text = String.Empty
TextBox2.Text = String.Empty
TextBox3.Text = String.Empty
Return ' Salir si no hay fila seleccionada
End If
Dim filaActualIndex As Integer = DataGridView1.CurrentRow.Index
' --- Acceso por Índice (Ejemplo) ---
If DataGridView1.Rows(filaActualIndex).Cells.Count > 0 Then
Dim valorColumna0 = DataGridView1.Rows(filaActualIndex).Cells(0).Value
If valorColumna0 IsNot Nothing AndAlso Not IsDBNull(valorColumna0) Then
TextBox1.Text = valorColumna0.ToString()
Else
TextBox1.Text = String.Empty
End If
Else
TextBox1.Text = String.Empty
End If
' --- Acceso por Nombre (Ejemplo) ---
Dim columnaCorreoIndex As Integer = -1
If DataGridView1.Columns.Contains("CorreoDeUsuario") Then
columnaCorreoIndex = DataGridView1.Columns("CorreoDeUsuario").Index
End If
If columnaCorreoIndex <> -1 AndAlso DataGridView1.Rows(filaActualIndex).Cells.Count > columnaCorreoIndex Then
Dim valorCorreo = DataGridView1.Rows(filaActualIndex).Cells(columnaCorreoIndex).Value
If valorCorreo IsNot Nothing AndAlso Not IsDBNull(valorCorreo) Then
TextBox2.Text = valorCorreo.ToString()
Else
TextBox2.Text = String.Empty
End If
Else
TextBox2.Text = String.Empty
End If
' Puedes agregar más asignaciones para otros TextBoxes y columnas aquí
End Sub
En C#:private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
// Limpiar TextBoxes si no hay fila seleccionada (opcional pero recomendado)
if (dataGridView1.CurrentRow == null)
{
textBox1.Text = string.Empty;
textBox2.Text = string.Empty;
textBox3.Text = string.Empty;
return; // Salir si no hay fila seleccionada
}
int filaActualIndex = dataGridView1.CurrentRow.Index;
// --- Acceso por Índice (Ejemplo) ---
if (dataGridView1.Rows[filaActualIndex].Cells.Count > 0)
{
object valorColumna0 = dataGridView1.Rows[filaActualIndex].Cells[0].Value;
if (valorColumna0 != null && valorColumna0 != DBNull.Value)
{
textBox1.Text = valorColumna0.ToString();
}
else
{
textBox1.Text = string.Empty;
}
}
else
{
textBox1.Text = string.Empty;
}
// --- Acceso por Nombre (Ejemplo) ---
int columnaCorreoIndex = -1;
if (dataGridView1.Columns.Contains("CorreoDeUsuario"))
{
columnaCorreoIndex = dataGridView1.Columns["CorreoDeUsuario"].Index;
}
if (columnaCorreoIndex != -1 && dataGridView1.Rows[filaActualIndex].Cells.Count > columnaCorreoIndex)
{
object valorCorreo = dataGridView1.Rows[filaActualIndex].Cells[columnaCorreoIndex].Value;
if (valorCorreo != null && valorCorreo != DBNull.Value)
{
textBox2.Text = valorCorreo.ToString();
}
else
{
textBox2.Text = string.Empty;
}
}
else
{
textBox2.Text = string.Empty;
}
// Puedes agregar más asignaciones para otros TextBoxes y columnas aquí
}
Este código se ejecutará cada vez que el usuario seleccione una fila diferente, actualizando los TextBoxes con los datos de la fila seleccionada.
Preguntas Frecuentes
¿Qué evento debo usar para detectar la selección de una fila?
El evento más adecuado es SelectionChanged. Se dispara cuando la selección de celdas cambia, lo cual, si tienes configurado el DataGridView para seleccionar filas completas, ocurre al seleccionar una nueva fila.
¿Cómo obtengo el valor de una columna específica de la fila seleccionada?
Primero obtén la fila seleccionada usando DataGridView1.CurrentRow. Luego, accede a la colección Cells de esa fila por el índice de la columna (.Cells(indice) o .Cells[indice]) o por el índice obtenido a partir del nombre de la columna (.Cells(DataGridView1.Columns("NombreColumna").Index)). Finalmente, accede a la propiedad .Value de la celda.
¿Qué hago si no hay fila seleccionada en el DataGridView?
La propiedad CurrentRow será Nothing (VB.NET) o null (C#). Es crucial verificar si CurrentRow no es nulo antes de intentar acceder a sus propiedades como Index o Cells. Si es nulo, puedes limpiar los TextBoxes.
¿El valor de la celda es siempre texto?
No, el valor de la celda se obtiene como tipo Object y puede ser de varios tipos (números, fechas, booleanos, etc.) o incluso DBNull.Value. Para mostrarlo en un TextBox, debes convertirlo a cadena usando ToString(). Si necesitas el valor en su tipo original para otras operaciones, deberás realizar la conversión o el casting adecuado.
¿Puedo pasar datos a más de un TextBox?
Sí, puedes asignar el valor de diferentes celdas (columnas) de la misma fila seleccionada a diferentes TextBoxes, como se muestra en los ejemplos de código, simplemente accediendo a otras celdas de la fila.
Conclusión
Pasar datos de un DataGridView a uno o varios TextBox en aplicaciones Windows Forms es una tarea fundamental que mejora la interactividad de tu interfaz de usuario. Utilizando el evento SelectionChanged y accediendo a la propiedad CurrentRow, puedes obtener la fila seleccionada y extraer los valores de sus celdas ya sea por su índice numérico o, de forma más recomendada, por el nombre de la columna para hacer tu código más robusto. Recuerda manejar posibles valores nulos y convertir los datos a cadena para asignarlos a los TextBoxes. Con esta técnica, tus usuarios podrán ver los detalles de los registros con facilidad al navegar por tu DataGridView.
Si quieres conocer otros artículos parecidos a DataGridView a TextBox: Muestra Datos Seleccionados puedes visitar la categoría Programación.

Aprende mas sobre MySQL