¿Como llenar un DataGrid con registros obtenidos de una base de datos?

publicado por: Anonymous

Quiero llenar un DataGrid que tiene columnas predefinas y los datos se obtienen de una base de datos. Anteriormente utilizaba el siguiente codigo para llenar el DataGrid realizado con C# en Visual Studio 2017 en una ventana (WPF)

public void llenarDataGrid()
{
    String consulta = "select idUsuario,Nombre,ApellidoP,ApellidoM,Sexo,Telefono,Edad,Puesto from usuarios;";
    SqlDataAdapter dataAdapter = new SqlDataAdapter(consulta,new BaseDeDatos().obtenerConexion());
    DataSet ds = new DataSet();
    dataAdapter.Fill(ds);
    dataGridUsuarios.ItemsSource = ds.Tables[0].DefaultView;
}

El DataGrid quedo de la siguiente manera despues de ingresar las columnasintroducir la descripción de la imagen aquí

Pongo el idUsuario en la consulta por que me gustaria que al momento de seleccionar algun registro obtener el idUsuario en lugar de obtener el indice de la fila

solución

Puedes intentar hacer los siguiente, obtener las tablas dentro de tu dataset

DataTableCollection collection = ds.Tables;

Posterior a eso obtienes la DataTable que contiene los datos:

DataTable table = collection[0];

hasta ahi tienes una DataTable que haremos uso posteriormente.

El ejemplo que pondre no seran con todos tus datos pero se que se entendera para que puedas reproducirlo.

Tu datagrid debe de ser editado para poder ingresar datos desde el codigo, ya que añadiste columnas por defecto debes agregar un binding a todas tus columnas:

<DataGrid x:Name="dataGridUsuarios" CanUserAddRows="True" HorizontalAlignment="Left" Margin="64,70,0,0" VerticalAlignment="Top" Height="210" Width="364">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Path=nombre}" ClipboardContentBinding="{x:Null}" Header="nombre" HeaderStringFormat="Nombre" Width="100"/>
        <DataGridTextColumn Binding="{Binding Path=apellido}" ClipboardContentBinding="{x:Null}" Header="apellido" HeaderStringFormat="Apellido" Width="100"/>
        <DataGridTextColumn Binding="{Binding Path=sexo}" ClipboardContentBinding="{x:Null}" Header="sexo" HeaderStringFormat="Sexo" Width="80"/>
        <DataGridTextColumn Binding="{Binding Path=edad}" ClipboardContentBinding="{x:Null}" Header="edad" HeaderStringFormat="Edad" Width="70"/>
    </DataGrid.Columns>
</DataGrid>

Las partes como Binding="{Binding Path=nombre}" son las importantes aqui ya que gracias a estas se importaran los datos.

Posterior a ese deberás crear una clase para añadir tus filas con todos los datos que seas mostrar, en mi ejemplo solo trabajare con cuatro: nombre, apellido, sexo, edad.

Entonces:

 public class Modelo
 {
     public string nombre { get; set; }
     public string apellido { get; set; }
     public string sexo { get; set; }
     public string edad { get; set; }
 }

Entonces imaginemos que mi datatable table, anteriormente mencionado tiene esos datos, lo que ahora debemos hacer es recorrer ese datatable para añadir esos contenidos a nuestro datagrid.

foreach (DataRow row in table.Rows)
{
    var data = new Modelo { nombre = row["Nombre"].ToString(), apellido = row["Apellidos"].ToString(), sexo = row["Sexo"].ToString(), edad = row["Edad"].ToString() };
    dataGridUsuarios.Items.Add(data);
}

donde los row["Nombre"] son valores de tu consulta, tu tendras unos de esta forma:

row["idUsuario"]
row["Nombre"]
row["ApellidoP"]
row["ApellidoM"]// y asi con todos tus datos.

Posterior a eso tendria que darte un resultado similar a este.

introducir la descripción de la imagen aquí

Ademas ten en cuenta que los Path=nombre de tu archivo xaml deben tener el mismo formato de tu modelo.

Ademas, sobre el id que mecionas que deseas poner lo puedes hacer como los hiciste con las otras columnas pero como este no deberia de poder verse, puedes definirlo con Visibility="Hidden". Ej:

<DataGridTextColumn Binding="{Binding Path=id}" ClipboardContentBinding="{x:Null}" Header="id" HeaderStringFormat="id" Visibility="Hidden"/>
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *