none
como puedo agregar una fila a un datagrid que contiene 3 columnas RRS feed

  • Pregunta

  • Hola a todos, pues venia a molestarlos:( lo que pasa tengo un problemilla con el datagrid del wpf, en expression blen4:( no se como agregar una fila que ya contiene 3 columnas de tipo datacolumntextbox alguien me ayuda? despues debo hacer una suma entre las 2 primeras columnas..
    miércoles, 27 de octubre de 2010 17:09

Respuestas

  • Hola victor.

    No se como estas realizando el binding, aunque tengas columnas en el grid, siempre y cuando estes insertando el mismo tipo de objeto a los items del grid, deberia de tener un comportamiento correcto.

    Si quieres añadir una sola fila, la puedes añadir en la propiedad Items del grid, para añadir varias, igual, pero trabajando con la coleccion de items.

    Como no se que codigo tienes ni como lo enlazas, he preparado uno sencillito basandome en el posteado en otra conversacion parecida.

     

    codigo XAML:

      <Grid>
        <DataGrid AutoGenerateColumns="False" Height="200" HorizontalAlignment="Left" Margin="12,12,0,0" Name="dataGrid1" 
             VerticalAlignment="Top" Width="200" ItemsSource="{Binding}">
          <DataGrid.Columns>
            <DataGridTextColumn Header="ID" Binding="{Binding ID}" />
            <DataGridTextColumn Header="Nombre" Binding="{Binding Nombre}"/>
            <DataGridTextColumn Header="Apellidos" Binding="{Binding Apellidos}"/>
            <DataGridTextColumn Header="Edad" Binding="{Binding Edad}"/>
          </DataGrid.Columns>
        </DataGrid>
        <Button Content="añadir items" HorizontalAlignment="Left" Margin="12,218,0,0" Name="btn_addItems" VerticalAlignment="Top" Click="btn_addItems_Click" />
      </Grid>
    

    tan solo un grid y un boton para añadir mas registros. Como se puede observar el grid tiene 4 columnas definidas y enlazadas a una propiedad especifica.

     

    Codigo .cs

    private System.Data.DataSet createDataSet(string _name, string _surname)
    {      
      // crear la tabla 
      System.Data.DataTable table = new System.Data.DataTable();
      table.Columns.Add("ID");
      table.Columns.Add("Nombre");
      table.Columns.Add("Apellidos");
      table.Columns.Add("Edad");
    
      // crear 10 filas y añadirlas a la tabla
      for (int i = 0; i < 10; i++)
      {
        // crear la fila
        System.Data.DataRow row = table.NewRow();
    
        // añadir valores
        row["ID"] = i;
        row["Nombre"] = _name + " " + i.ToString();
        row["Apellidos"] = _surname + " " + i.ToString();
        row["Edad"] = 80 - i;
    
        // insertar la fila en la tabla
        table.Rows.Add(row);
      }
    
      // crear un DataSet y añadir la tabla
      System.Data.DataSet dataSet = new System.Data.DataSet();
      dataSet.Tables.Add(table);
    
      // retornar el dataset
      return dataSet;
    }
    
    public MainWindow()
    {
      InitializeComponent();
    
      // obtener la vista de la tabla
      System.Data.DataView view = createDataSet("David", "Gonzalez").Tables[0].DefaultView;
      // ordenar la vista de la tabla
      view.Sort = "Edad";
    
      // establecer la fuente de datos al datagrid
      dataGrid1.ItemsSource = ((System.ComponentModel.IListSource)view.ToTable()).GetList();
    }
    
    private void btn_addItems_Click(object sender, RoutedEventArgs e)
    {
      // obtener los items del grid
      IEnumerable<System.Data.DataRowView> items = dataGrid1.Items.OfType<System.Data.DataRowView>();
      // TODO: ... realizar alguna operacion deseada con los items ...
    
      // crear otra tabla y obtener la vista que se crea para añadir datos
      System.Data.DataView view = createDataSet("Pepe", "ramirez").Tables[0].DefaultView;
      var newItems = ((System.ComponentModel.IListSource)view.ToTable()).GetList().Cast<System.Data.DataRowView>().ToList();
      newItems.AddRange(items);
          
      // añadir el nuevo item source con los nuevos elementos
      dataGrid1.ItemsSource = newItems;
          
    }
    

    En este codigo existe una funcion para crear un dataset, el cual usaremos como fuente de datos pasandolo previamente a una lista. 

    Se puede observar en el constructor de la clase como se ordena la lista y se inserta como fuente de datos en el grid, la cual sera usada por las columnas del grid para hacer el binding de los datos correspondientes asignados.

    En el evento del boton, al pulsarse, se obtienen los items del grid, se crea otra lista con otros datos y se juntan las 2 listas para tener un total de 20 elementos, los cuales seran añadidos a la fuente de datos del grid.

     

    Todo esto se puede hacer de muchas formas diferentes, depende de como lo tengas montado, pero esto es un ejemplo basico en el que te puedes apollar para adaptar tu codigo.

    Ya contaras que tal.

     


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/
    • Marcado como respuesta victor_23 domingo, 31 de octubre de 2010 18:18
    domingo, 31 de octubre de 2010 11:34

Todas las respuestas

  • ¡Hola!

    Debes de asignar una fuente de datos a tu datagrid. Josue explica varias formas de hacerlo en el siguiente post: http://social.msdn.microsoft.com/Forums/es-ES/wpfes/thread/ad97ecf7-a3b3-41cf-84b2-f93d8a53156d

     

    Saludos,

     

    jueves, 28 de octubre de 2010 7:47
  • Hola victor.

    ¿a que te refieres con que tienes una fila que tiene 3 columnas de tipo datacolumntextbox?, ¿puedes poner el codigo que tienes del datagrid para ver como lo tienes implementado?

    ¿es el mismo problema que el de este post?

    http://social.msdn.microsoft.com/Forums/es-ES/wpfes/thread/e7d94069-33f7-49ad-8677-09a9faad942a

     


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/
    jueves, 28 de octubre de 2010 18:18
  • MM hola a todos, pues nou no usare linq y pues se que uno con el itemsource puede agregar mediante lista pero el detalle esta que en el datagrid ya existe unas columnas definidas que se llaman: Cuenta, Codigo y Suma.. estos deben ser llenados con nuevos datos correspondiente a cada una de las columnas osea

    Cuenta   Codigo  Suma

    Venta      1.0.0.1   100.0   cada una de las filas las quiero agregar mediante codigo no por xaml:(

    Banco     1.1.0.0   3000

     mi problema esta que como yo ya tengo definidas las columnas en el datagrid si genero una list<> pasandole una clase con los metodos get y set. me repite los headers de las columnas:( y no me muestra los datos que se insertan

    domingo, 31 de octubre de 2010 2:31
  • Hola victor.

    No se como estas realizando el binding, aunque tengas columnas en el grid, siempre y cuando estes insertando el mismo tipo de objeto a los items del grid, deberia de tener un comportamiento correcto.

    Si quieres añadir una sola fila, la puedes añadir en la propiedad Items del grid, para añadir varias, igual, pero trabajando con la coleccion de items.

    Como no se que codigo tienes ni como lo enlazas, he preparado uno sencillito basandome en el posteado en otra conversacion parecida.

     

    codigo XAML:

      <Grid>
        <DataGrid AutoGenerateColumns="False" Height="200" HorizontalAlignment="Left" Margin="12,12,0,0" Name="dataGrid1" 
             VerticalAlignment="Top" Width="200" ItemsSource="{Binding}">
          <DataGrid.Columns>
            <DataGridTextColumn Header="ID" Binding="{Binding ID}" />
            <DataGridTextColumn Header="Nombre" Binding="{Binding Nombre}"/>
            <DataGridTextColumn Header="Apellidos" Binding="{Binding Apellidos}"/>
            <DataGridTextColumn Header="Edad" Binding="{Binding Edad}"/>
          </DataGrid.Columns>
        </DataGrid>
        <Button Content="añadir items" HorizontalAlignment="Left" Margin="12,218,0,0" Name="btn_addItems" VerticalAlignment="Top" Click="btn_addItems_Click" />
      </Grid>
    

    tan solo un grid y un boton para añadir mas registros. Como se puede observar el grid tiene 4 columnas definidas y enlazadas a una propiedad especifica.

     

    Codigo .cs

    private System.Data.DataSet createDataSet(string _name, string _surname)
    {      
      // crear la tabla 
      System.Data.DataTable table = new System.Data.DataTable();
      table.Columns.Add("ID");
      table.Columns.Add("Nombre");
      table.Columns.Add("Apellidos");
      table.Columns.Add("Edad");
    
      // crear 10 filas y añadirlas a la tabla
      for (int i = 0; i < 10; i++)
      {
        // crear la fila
        System.Data.DataRow row = table.NewRow();
    
        // añadir valores
        row["ID"] = i;
        row["Nombre"] = _name + " " + i.ToString();
        row["Apellidos"] = _surname + " " + i.ToString();
        row["Edad"] = 80 - i;
    
        // insertar la fila en la tabla
        table.Rows.Add(row);
      }
    
      // crear un DataSet y añadir la tabla
      System.Data.DataSet dataSet = new System.Data.DataSet();
      dataSet.Tables.Add(table);
    
      // retornar el dataset
      return dataSet;
    }
    
    public MainWindow()
    {
      InitializeComponent();
    
      // obtener la vista de la tabla
      System.Data.DataView view = createDataSet("David", "Gonzalez").Tables[0].DefaultView;
      // ordenar la vista de la tabla
      view.Sort = "Edad";
    
      // establecer la fuente de datos al datagrid
      dataGrid1.ItemsSource = ((System.ComponentModel.IListSource)view.ToTable()).GetList();
    }
    
    private void btn_addItems_Click(object sender, RoutedEventArgs e)
    {
      // obtener los items del grid
      IEnumerable<System.Data.DataRowView> items = dataGrid1.Items.OfType<System.Data.DataRowView>();
      // TODO: ... realizar alguna operacion deseada con los items ...
    
      // crear otra tabla y obtener la vista que se crea para añadir datos
      System.Data.DataView view = createDataSet("Pepe", "ramirez").Tables[0].DefaultView;
      var newItems = ((System.ComponentModel.IListSource)view.ToTable()).GetList().Cast<System.Data.DataRowView>().ToList();
      newItems.AddRange(items);
          
      // añadir el nuevo item source con los nuevos elementos
      dataGrid1.ItemsSource = newItems;
          
    }
    

    En este codigo existe una funcion para crear un dataset, el cual usaremos como fuente de datos pasandolo previamente a una lista. 

    Se puede observar en el constructor de la clase como se ordena la lista y se inserta como fuente de datos en el grid, la cual sera usada por las columnas del grid para hacer el binding de los datos correspondientes asignados.

    En el evento del boton, al pulsarse, se obtienen los items del grid, se crea otra lista con otros datos y se juntan las 2 listas para tener un total de 20 elementos, los cuales seran añadidos a la fuente de datos del grid.

     

    Todo esto se puede hacer de muchas formas diferentes, depende de como lo tengas montado, pero esto es un ejemplo basico en el que te puedes apollar para adaptar tu codigo.

    Ya contaras que tal.

     


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/
    • Marcado como respuesta victor_23 domingo, 31 de octubre de 2010 18:18
    domingo, 31 de octubre de 2010 11:34
  • DataGrid x:Name="gri" Margin="324,0,8,8" RowDetailsVisibilityMode="VisibleWhenSelected" CellStyle="{DynamicResource DataGridCellStyle1}" AutoGenerateColumns="False" Height="326.752" VerticalAlignment="Bottom" d:LayoutOverrides="VerticalAlignment">
    			<DataGrid.Columns>
    				<DataGridTextColumn Header="cuenta" Width="120"/>
    				<DataGridTextColumn Header="Fecha" Width="80"/>
    				<DataGridTextColumn Header="Debe" Width="80"/>
    				<DataGridTextColumn Header="Haber" Width="80"/>
    				<DataGridTextColumn Header="Saldo" Width="80"/>
    			</DataGrid.Columns>
    		</DataGrid>

    Disculpa David no me habia percatado el codigo:( aca te dejo el xml

     

    y pues si esta bastante claro tu ejemplo gracias:)

    pues a como te decia yo la informacion que agregare al datagrid viene de un textbox pero ahora me puse a pensar que me salia mas conveniente guardar la info en la BBDD despues cargarlas con dataset directamente al datagrid pero probare tu codigo para aprender otra leccion:) gracias por las ayudas

     

    domingo, 31 de octubre de 2010 18:18