none
Es posible ordenar los valores dentro de un datagrid? RRS feed

  • Pregunta

  • Hola,

    tengo una duda,

    es posible ordenar los valores por orden alfabetico dentro de un datagrid?

    por defecto veo que se cargan segun orden de incorporacion, pero es un caos buscar un campo..

    lo tengo declarado con un Multibinding, pero querria mostrarlo por orden de apellido por ejemplo

    ataGrid Name="grdDatos" Grid.Row="1" Margin="5" FontSize="18" FontFamily="Calibri"
             VerticalAlignment="Stretch" HorizontalAlignment="Stretch" 
             AutoGenerateColumns="False" IsSynchronizedWithCurrentItem="True"  ItemsSource="{Binding}" >
          <DataGrid.Columns >
            <DataGridTextColumn Header="id" Binding="{Binding Path=id}" MinWidth="20"></DataGridTextColumn>
            <DataGridTemplateColumn Header="Nom amistat" Width="50*" >
            <DataGridTemplateColumn.CellTemplate>
              <DataTemplate>
                <TextBlock>
                   <TextBlock.Text>
                       <MultiBinding StringFormat="{}{0} {1}">
                          <Binding Path="nombre"/>
                          <Binding Path="apellidos"/>
                       </MultiBinding>
                   </TextBlock.Text>
                </TextBlock>
              </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
          </DataGridTemplateColumn>
          </DataGrid.Columns>
        </DataGrid>
    
    Gracias


    Spandau
    miércoles, 27 de octubre de 2010 9:51

Respuestas

  • ¡Hola!

    Sirvase un ejemplo:

    Private Sub grdDatos_SelectionChanged(ByVal sender As Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs) Handles grdDatos.SelectionChanged
    
      Try
    
       If e.AddedItems.Count > 0 Then
        RowSeleccionada = CType(e.AddedItems(0), ClaseFila)
       
    'Siendo RowSeleccionada una propiedad en el mismo UserControl: 
    'Private _RowSeleccionada As New ClaseFila
     'Public Property RowSeleccionada() As ClaseFila
      'Get
       'Return _RowSeleccionada
      'End Get
      'Set(ByVal value As ClaseFila)
       _'RowSeleccionada = value
      'End Set
     'End Property
    'El tipo de la propiedad queda definido en la clase:
    'Public Class ClaseFila
    
    'Pongo algunas propiedades
    
     'Declaración de propiedades
     'Private _ID As Integer
     'Private _Nombre As String
     'Private _Edad As Integer
     'Public Property ID() As Integer
      'Get
       'Return _ID  
     ' End Get
      'Set(ByVal value As Integer)
       '_ID = value
      'End Set
     'End Property
      'Public Property Nombre() As String
      'Get
       'Return _Nombre  'End Get
      ' Set(ByVal value As String)
       ' _Nombre= value
      'End Set
     ' End Property
     'Public Property Edad() As Integer
      'Get
       'Return _Edad
      ' End Get
      'Set(ByVal value As Integer)
       ' _Edad= value
      ' End Set
     'End Property
     'End Class
    
    'Aqui iría la asignación de RowSeleccionada a tus textblock 
    
    End If
    
      Catch ex As Exception
       Er(ex)
      End Try
    
     End Sub
    
    

    Saludos,

    • Marcado como respuesta Spandau sábado, 13 de noviembre de 2010 11:48
    jueves, 11 de noviembre de 2010 20:05

Todas las respuestas

  • ¡Hola!

    por defecto veo que se cargan segun orden de incorporacion, pero es un caos buscar un campo..

    En tu sentencia LINQ pon un order by para que te los ordene antes de asignar ;-)

    VB.NET

     Dim q = From p In db.Products _
          Group p By p.CategoryID Into Group _
          Select Group
    
    
    

    C#

    var list = developers.Where(d => d.Language == "C#") 
    .OrderBy(d => d.Name,new CaseInsensitiveComparer()) 
    .Select(d => d.Name);
    

    Un saludo,

    miércoles, 27 de octubre de 2010 11:42
  • Hola Corsario,

    disculpa, pero tengo muchas dudas, ya que el datagrid lo cargo directamente de dataset:

    Public Sub New()
           Try
          InitializeComponent()
         ' Obtenemos nuestros datos.
          Me.DataContext = dsamistats.amistats
          Me.View = CollectionViewSource.GetDefaultView(Me.dsamistats.amistats)
          Me.txtdatanaixement.Text = Convert.ToDateTime(dataok, cultura)
        Catch ex As Exception
          MsgBox("error a la funcio Sub New de mainwindow")
          MsgBox(ex.ToString)
        End Try
      End Sub
    

    que tendria que modificar y como?

    Gracias

     


    Spandau
    miércoles, 27 de octubre de 2010 12:22
  • ¡Hola!

    ¿Cómo cargas el dataset?. Supongo que es dsamistats y amistats la tabla.

    Saludos,

    miércoles, 27 de octubre de 2010 13:22
  • correcto,

    pero como lo cargo a través de linq?

    Gracias


    Spandau
    miércoles, 27 de octubre de 2010 13:36
  • ¡Hola Spandau!

    De forma similar a como te lo explicaba Yeray en: http://social.msdn.microsoft.com/Forums/es-ES/wpfes/thread/ad97ecf7-a3b3-41cf-84b2-f93d8a53156d

    Ahh. Ok que cargas el DataSet directamente. Puedes intentar a cargarle una lista en vez del DataSet (Una lista ordenada ;-)). Y si no tienes éxito, puedes recorrer la lista y asignarle los valores al dataSet (en realidad al table), eso sí, acuerdate de borrar los que tengas previamente.

    Un saludo,

    miércoles, 27 de octubre de 2010 16:15
  • Cargar el grid de datos con el linq ordenadamente ha sido facilísimo...

    pero tengo otro problema....

    en este grid solamente tengo una columna que me muestra nombrecompleto y si quiero ver el detalle cliko sobre la fila y al lado tengo otro  grid con varias filas que me muestra todos los detalles  de la persona seleccionada.

    Al cargar el grid anterior con linq  no me cargan los detalles y estoy mirando el codigo y no veo como se enlazan para corregirlo si es posible..


    Spandau
    miércoles, 27 de octubre de 2010 22:19
  • ¡Hola!

    Me alegro ;-)

    La carga del otro grid debería de ser una consulta LINQ en la que filtras por nombre (WHERE) y asignas esos resultados a una lista (fuente de datos). Esta consulta debe de retornarte sólo los detalles de la persona seleccionada.

    Todo ello debe de ir en un evento. El que se dispara al clickear sobre la fila de tu DataGrid, eso sí, no se te olvide limpiar tu fuente de datos antes de introducirle los nuevos.

    Un saludo, 

    jueves, 28 de octubre de 2010 7:30
  • Hola Corsario,

    ya me lo estudiaré,

    en principio lo tenia mas o menos definido como el ejemplo  simple de Josue:

                        http://jyeray.blogspot.com/2010/05/net-4-wpf-descubriendo-la-potencia-de.html

    y me funcionava... ya  miraré si lo puedo resolver ..

    gracias


    Spandau
    jueves, 28 de octubre de 2010 8:31
  • ¡Hola!

    Si lo haces así (No recordaba esa entrada de Josue. Yo no suelo trabajar así porque antiguamente, en los principios, los controles creados con el asistente no se refrecaban bien. Asi que me acostumbre a hacer todo por código, más laborioso pero me permite más control.  ;-)) lo que debes de cambiar es tu TableAdapter y en tu sentencia SQL introducir los ORDER BY.

    Refresca tus sentencias de los TableAdpaters.

     

    Un saludo,

     

     

    jueves, 28 de octubre de 2010 12:10
  • Hola spandau.

    Si haces uso de DataTables, no tiene sentido usar linq para ordenar, ya que puedes hacerlo con la defaultview, asi como hacer selects y otras tantas operaciones con las tablas.

    Te voy a poner un ejemplo con 2 opciones que solia usar cuando usaba tablas y datasets, con este ejemplo puedes practicar el enlace a un datagrid:

        private System.Data.DataSet createDataSet()
        {      
          // 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"] = "nombre " + i.ToString();
            row["Apellidos"] = "apellido " + 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();
    
          // --------------------------------------------------------------------------------------------
          // MODO 1.- enlazar la vista de la tabla ordenada por edad mediante conversion con IListSource
    
          // obtener la vista de la tabla
          System.Data.DataView view = createDataSet().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();
    
          // --------------------------------------------------------------------------------------------
          // MODO 2.- enlazar la vista de la tabla ordenada por edad descendente mediante un CollectionViewSource
    
          // obtener la vista de la tabla
          System.Data.DataView view2 = createDataSet().Tables[0].DefaultView;
          // ordenar la vista de la tabla
          view2.Sort = "Edad DESC";
    
          // crear un CollectionView y agregarle la vista 
          // NOTA: (si se dispone de uno en el codigo xaml, se puede usar en lugar de crearlo)
          CollectionView collectionViewSource = (CollectionView)CollectionViewSource.GetDefaultView(view2);
    
          // asociar el CollectionView al datagrid
          dataGrid1.ItemsSource = collectionViewSource;
        }
    

     

    Tambien he creado un dataset a pelo para el ejemplo. En el ejemplo se hace uso de la defaultView para ordenar ascendente o descendente.

    Ya contaras si te sirve.

     


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/
    • Propuesto como respuesta CorsarioVasco viernes, 29 de octubre de 2010 7:59
    jueves, 28 de octubre de 2010 20:02
  • Hola de nuevo.

    Se me olvido comentar que hace tiempo me hice un snippet para crear la tabla, de modo que se pueda crear rapidamente una tabla a modo de ejemplo para pruebas y demas, asi que aqui posteo el codigo para el que lo quiera:

     

    <?xml version="1.0" encoding="utf-8"?>
    <CodeSnippet Format="1.0.0" xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
     <Header>
      <Title>createDataSet</Title>
      <Author>David González Zornoza</Author>
      <Shortcut>createDataSet</Shortcut>
      <Description>Snippet para crear un DataSet con 1 tabla y registros</Description>
      <SnippetTypes>   
       <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
     </Header>
     <Snippet>
      <Declarations>
       <Literal>
        <ID>column1</ID>
        <Default>ID</Default>
        <ToolTip>Nombre de la columna 1</ToolTip>
       </Literal>
       <Literal>
        <ID>column2</ID>
        <Default>Nombre</Default>
        <ToolTip>Nombre de la columna 1</ToolTip>
       </Literal>
       <Literal>
        <ID>column3</ID>
        <Default>Apellidos</Default>
        <ToolTip>Nombre de la columna 1</ToolTip>
       </Literal>
       <Literal>
        <ID>column4</ID>
        <Default>Edad</Default>
        <ToolTip>Nombre de la columna 1</ToolTip>
       </Literal>
       <Literal>
        <ID>length</ID>
        <Default>10</Default>
        <ToolTip>numero de filas a crear en la tabla</ToolTip>
       </Literal>
      </Declarations>
      <Code Language="csharp">
       <![CDATA[
    // crear la tabla 
    System.Data.DataTable table = new System.Data.DataTable();
    table.Columns.Add("$column1$");
    table.Columns.Add("$column2$");
    table.Columns.Add("$column3$");
    table.Columns.Add("$column4$");
    
    // crear 10 filas y añadirlas a la tabla
    for (int i = 0; i < $length$; i++)
    {
      // crear la fila
      System.Data.DataRow row = table.NewRow();
    
      // añadir valores
      row["$column1$"] = i;
      row["$column2$"] = "nombre " + i.ToString();
      row["$column3$"] = "apellido " + i.ToString();
      row["$column4$"] = 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);
    
    ]]>
      </Code>
     </Snippet>
    </CodeSnippet>
    
    

    Este codigo se mete en un archivo con nombre (por ejemplo "createDataSet.snippet") y luego en VS se va al menu herramientas->administrador fragmentos de codigo y se pulsa sobre el boton 'importar', se selecciona el archivo y se guarda en 'My snippets' por ejemplo.

    Para usarlo en VS en una funcion tan solo hay que teclear 'create' y saldra el intelissense con el snippet con lo cual se pulsa 2 veces el tabulador y ya esta creada la tabla

    El funcionamiento es igual que para otros snippets como for, try, etc.

    Una gran funcionalidad la de los snippets que mucha gente desconoce.

     

     

     

     

     


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/
    jueves, 28 de octubre de 2010 20:09
  • Gracias David,

     

    que currada que  te has hecho!!  lo del snippet no  lo conocia.. eso debe ser xml..

    he provado  de ejecutar el primer ejemplo para ver si lo puedo aplicar a mi proyecto y lo has hecho en C++ y me da un monton de errores, se ve simple, tambien ahora falta ver como enlazo mi dataset  mediante  el Dataview.

    he intentado crear un proyecto para ver su funcionamiento pero al ser en C++ me genera multitut de errores (los comentarios los he cambiado)enlace:

        -----borrado-----

     

    Gracias.


    Spandau
    • Editado Spandau sábado, 30 de octubre de 2010 23:48
    jueves, 28 de octubre de 2010 23:25
  • Hola spandau.

    El codigo esta en c# (aunque c# usa la sintaxis de c/c++), si haces uso de VB, puedes usar alguna de esas paginas que traducen el codigo, al no ser un codigo complejo no creo que haya problemas.

    De todas formas si tienes algun problema en la conversion, puedes comentarlo que seguro que amigo Corsario te ayuda, el conoce la sintaxis de VB bastante mejor que yo (ya te estoy dando faena corsario, xDDD)

    de todas formas, mirare el proyecto que has puesto y te comento algo.


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/
    viernes, 29 de octubre de 2010 18:34
  • Por alusiones ;-)

    Tranqui David, no es problema (lo vamos a negociar ;-), con la otra pregunta que has respondido en el foro). Si Spandau tiene algún problema para interpretar el código que lo diga e intentaré ayudarle.

    El Snippet era algo que ya conocía pero nunca lo había visto empleado :-) Thanks David (Te ganaste un punto extra ;-))

    Spandau mete el código que te ha puesto David en la siguient página y transformalo:http://www.developerfusion.com/tools/convert/csharp-to-vb/.  Si al compilar te da algún error postealo y lo miro (es por no llenar la pregunta con excesivo código y dificultar su compresión), no siempre el traductor funciona como debería, pero en principio, como dice David, su código es muy sencillo. 

    Saludos,

     

    viernes, 29 de octubre de 2010 19:05
  •  

    Hola,

    ya no me genera error!! perfecto,

    ahora me sale error cuando carga: No se puede implementar el método o la operación / No se controlo XamlParseException...

    en la ventana le puse  un datagrid con nombre Datagrid1...

     

    uff, es muy tarde,  mañana noche continuaré...

    MUCHAS GRACIAS A LOS 2 POR EL INTERÉS


    Spandau
    domingo, 31 de octubre de 2010 0:12
  • Hola compañeros,

    el error ayer me lo mire y era un error de nombre de la classe y ya esta solucionado, ahora me crea el datagrid con 11 filas (creo), pero son muy pequeñas y no muestran contenido, he provado las 2 opciones y estan igual...

    que me falla?

    paso el codigo en visual basic: (el modo2 esta comentado)

     

    Class MainWindow
    
      Function createDataset()
        ' crear la tabla 
        Dim table As 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 i As Integer = 0 To 9
          ' crear la fila
          Dim row As System.Data.DataRow = table.NewRow()
    
          ' añadir valores
          row("ID") = i
          row("Nombre") = "nombre " & i.ToString()
          row("Apellidos") = "apellido " & i.ToString()
          row("Edad") = 80 - i
    
          ' insertar la fila en la tabla
          table.Rows.Add(row)
        Next
    
        ' crear un DataSet y añadir la tabla
        Dim dataSet As New System.Data.DataSet()
        dataSet.Tables.Add(table)
    
        ' retornar el dataset
        Return dataSet
      End Function
    
      Public Sub New()
        InitializeComponent()
    
        ' --------------------------------------------------------------------------------------------
        ' MODO 1.- enlazar la vista de la tabla ordenada por edad mediante conversion con IListSource
    
        ' obtener la vista de la tabla
        Dim view As System.Data.DataView = createDataset().Tables(0).DefaultView
        ' ordenar la vista de la tabla
        view.Sort = "Edad"
    
        ' establecer la fuente de datos al datagrid
        DataGrid1.ItemsSource = DirectCast(view.ToTable(), System.ComponentModel.IListSource).GetList()
        ' DataGrid1.ItemsSource = DirectCast(view.ToTable, System.ComponentModel.IListSource).GetList()
    
    
        ' --------------------------------------------------------------------------------------------
        ' MODO 2.- enlazar la vista de la tabla ordenada por edad descendente mediante un CollectionViewSource
    
        ' obtener la vista de la tabla
        ' Dim view2 As System.Data.DataView = createDataset().Tables(0).DefaultView
        ' ordenar la vista de la tabla
        'view2.Sort = "Edad DESC"
    
        ' crear un CollectionView y agregarle la vista 
        ' NOTA: (si se dispone de uno en el codigo xaml, se puede usar en lugar de crearlo)
        'Dim collectionViewSource__1 As CollectionView = DirectCast(CollectionViewSource.GetDefaultView(view2), CollectionView)
    
        ' asociar el CollectionView al datagrid
        ' DataGrid1.ItemsSource = collectionViewSource__1
      End Sub
    
    End Class
    
    

    y en la ventana xaml tengo:

    <Window x:Class="MainWindow"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Title="MainWindow" Height="350" Width="525">
      <Grid>
        <DataGrid AutoGenerateColumns="False" Height="261" IsSynchronizedWithCurrentItem="True" FontSize="12" HorizontalAlignment="Left" Name="DataGrid1" VerticalAlignment="Top" Width="394" ItemsSource="{Binding}"/>
      </Grid>
    </Window>
    
    


    Spandau
    martes, 2 de noviembre de 2010 9:42
  • ¡Hola!

    Modifica el RowHeight. Mira el siguiente ejemplo como guía: http://blogs.msdn.com/b/scmorris/archive/2008/03/21/using-the-silverlight-datagrid.aspx

    Un saludo,

    martes, 2 de noviembre de 2010 19:43
  • algun detalle se nos escapa con el view  he canviaso la altura y tengo los rows vacios,

    he provado y evidentemente me crea los valores... pero no los muestra...

    Que me falta? en el codigo anterior?

    Gracias.


    Spandau
    martes, 2 de noviembre de 2010 23:12
  • ¡Hola!

    Pon AutoGenerateColumns="True" ya que no defines las colunmas en el XAML. Por cierto, haz un Imports de System.Data. De esta forma te ahorras tener que estar poniéndolo constantemente al declarar un objeto.

    Saludos.

    miércoles, 3 de noviembre de 2010 16:27
  • Gracias Corsario,

    ya está, el ejemplo de  David se visualiza ok ,

    pero estoy mirando de aplicarlo a mi ejemplo y no hay manera,

    en el ejemplo de  David crea el dataset, crea el view y el programa le ordena OK,

    he mirado de aplicarlo a mi caso...y tengo problemas ya que cargo el dataset a traves de Tableadapters..

    mas o menos mi esquema de carga es 'copiado' al ejemplo de Yeray:

    Declaro dataset:

    Private midataset As New tabladataset1
    
    Private cargoaquidataset As New tabladataset1TableAdapters.tablaTableAdapter
    
    ahora creo la función... mirando de adaptar el ejemplo de David (algo hago mal aqui)... no sé como adaptarlo al ejemplo de David

    Function createDataset()
        cargoaquimidataset.Fill(midataset.tabla)
        Me.DataContext = midataset.tabla
        Return cussants
    End Function
    

    y ahora no tengo la propiedad .DefaultView en la funcion createDataset()

    la linea de David es:

      System.Data.DataView view2 = createDataSet().Tables[0].DefaultView;

    y  en mi caso con el Intellisense no tengo la propiedad antes mencionada... ya qye el createDataset() no retorna lo mismo...

    como lo puedo solucionar?

    Disculpas por mi 'pesadez'

    Gracias por adelantado


     

     


    Spandau
    miércoles, 3 de noviembre de 2010 22:04
  • ¡Hola!

    Haz lo siguiente:

    No sé que es cussants pero si eso es una función deberías de ponerle el tipo del retorno, sino se trata de un procedimiento y no retornaría valor (Sub)

    De todas formas tu con cargoaquimidataset.Fill(midataset.tabla) ya estas cargando el DataSet. Para hacerlo como David tendrías que hacer lo siguiente:

    Dim view2 as new DataView=midataset.tabla.DefaultView

    Si lo haces con la función debería de ser:

    Function createDataset() as datatable
        cargoaquimidataset.Fill(midataset.tabla)
        Return midataset.tabla 'Siendo este el datatable
    End Function

    Saludos,


       

    jueves, 4 de noviembre de 2010 9:33
  • Perfecto...

    al final ha salido... y ordenado!!

    DUDAS...

    dentro del datagrid que lo cargo tal y como he habeis aconsejado:

    Public Sub New()
        ' inicializamos
        InitializeComponent()
        'aqui cargo el dataset
        cussants.Fill(dsant.santoral)
        View = dsant.santoral.DefaultView
        'ahora ordenamos dataset campo nom
        View.Sort = "nom"
        ' ahoran cargamos al Datagrid grdDatos
        grdDatos.ItemsSource = DirectCast(View.ToTable(), System.ComponentModel.IListSource).GetList
    End Sub
    

     ha sido simple...

    pero tenia asociado al datagrid, por ejemplo el boton eliminar campo y ahora me genera error... como lo tengo que declarado me genera error en el View:

    Private Sub BtDel_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles BtDel.Click
        If View.ToTable > -1 Then
          Dim row = CType(Me.View.CurrentItem, System.Data.DataRowView).Row
          row.Delete()
          dsant.GetChanges()
        End If
      End Sub
    

     

    errores:

          Error    2    'CurrentItem' no es un miembro de 'System.Data.DataView'.   

         Error    1    'CurrentPosition' no es un miembro de 'System.Data.DataView'. 

    y luego tenia un grid con 2 texbox que me permite editar y que me carga la fila del datagrid seleccionada...ahora no lo hace..

    Gracias por vuestra voluntariosa ayuda...


    Spandau
    jueves, 4 de noviembre de 2010 22:12
  • ¡Hola!

    Ni  'CurrentItem', ni  'CurrentPosition'  es un miembro de 'System.Data.DataView': http://msdn.microsoft.com/es-es/library/system.data.dataview_members.aspx

    Lo que yo haría es recoger la fila seleccionada en un evento click de la celda sobre el Grid porque tal y como lo estas haciendo tu ejecutas un evento click sobre un botón sin controlar si existe o no una Row seleccionada.

    "y luego tenia un grid con 2 texbox que me permite editar y que me carga la fila del datagrid seleccionada...ahora no lo hace.."

    Comprueba que recoge valor cuando cargas la fila.

    Un saludo,

    domingo, 7 de noviembre de 2010 19:48
  • Una pregunta tambien muy basica...

    estoy hace rato intentando seleccionar un registro del Datagrid y no hay manera, quiero trabajar en él: añadir registro, eliminarlo...etc  ya que por ejemplo quiero  añadir registro en View.addNew(), que en princio tendria que funcionar y no me guarda nada..

    como  declarais  el registro que me permita añadir,eliminar..rtc

    el codigo ya esta anteriormente, pero lo vuelvo a colgar

    declaraciones......

     Public Sub New()
     
     InitializeComponent()
     'aqui cargo el dataset
    
     cussants.Fill(dsant.santoral)
     View = dsant.santoral.DefaultView
     'ordenamos el datagrid
     View.Sort = "nom"
    
     grdDatos.ItemsSource=DirectCast(View.ToTable().System.ComponentModel.IListSource).GetList
    
     End Sub
    

     

    Gracias por vuestra ayuda..

     


    Spandau
    lunes, 8 de noviembre de 2010 9:01
  • ¡Hola!

    Un "View: customized view of a DataTable for sorting". Es decir, que un View es una vista personalizada de un DataTable para ordenarse. Yo siempre realizo los cambios directamente sobre la tabla, no en la vista pero en fin, te dejo un enlace que te muestra cómo se añade una fila: http://msdn.microsoft.com/en-us/library/system.data.dataview.addnew.aspx

    Un saludo,

    lunes, 8 de noviembre de 2010 16:59
  • Hola a todos.

    Si, como comenta corsario hay que usar cada objeto para lo que sirve, el echo de que se permita hacer algo con un control no significa que este bien.

    Al igual que en una BBDD una tabla guarda los datos con los que se trabaja y una vista tan solo es una select sobre una tabla, de modo que lo ideal es usar la tabla para guardar el almacen de datos y la vista para realizar una consulta sobre esa tabla ya que si insertas un registro en la vista es por que internamente se añade a la tabla.


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/
    lunes, 8 de noviembre de 2010 19:44
  • ¡Hola!

    Me alegro ;-)

    La carga del otro grid debería de ser una consulta LINQ en la que filtras por nombre (WHERE) y asignas esos resultados a una lista (fuente de datos). Esta consulta debe de retornarte sólo los detalles de la persona seleccionada.

    Todo ello debe de ir en un evento. El que se dispara al clickear sobre la fila de tu DataGrid, eso sí, no se te olvide limpiar tu fuente de datos antes de introducirle los nuevos.

    Un saludo, 

    Hola corsario,

    como lo harias?

    el Datagrid que contiene el enlace a dataset se llama grdatos y tiene enlace binding a nom y data y los textos en los quales los quiero hacer servir para editar fuera del datagrid se llaman txtnom.Text y txtdata.Text,  he intentado hacer el linq como propones pero me estoy liando..

    y limpiar la fuente de datos a que te refieres?

    Gracias

    Gracias.

     

     


    Spandau
    lunes, 8 de noviembre de 2010 21:42
  • ¡Hola!

    Un "View: customized view of a DataTable for sorting". Es decir, que un View es una vista personalizada de un DataTable para ordenarse. Yo siempre realizo los cambios directamente sobre la tabla, no en la vista pero en fin, te dejo un enlace que te muestra cómo se añade una fila: http://msdn.microsoft.com/en-us/library/system.data.dataview.addnew.aspx

    Un saludo,

    Hola,

    si lo correcto es tal como comentais corsario y david que lo correcto es cargar sobre el Datatable, teneis algun ejemplo?

    o en mi caso como se declara?

    si quiero añadir al dataset dsant  (de momento el datatable no lo tengo declarado en el codigo), como lo añado directamente?

    l como entro los datos en los 2 texbox  que me mostraran el campo seleccionado del  DataView.... al hacer click en nuevo limpiarré los texbox pero cuando hago guardar como entro el contenido de  los 2 texbox al  dataset?

    estoy muy liado,

    si no fuese por vuestra ayuda...


    Spandau
    lunes, 8 de noviembre de 2010 22:16
  • ¡Hola!

    Mira este ejemplo y comparalo con lo que estas haciendo a ver si te solventa tus dudas: http://msdn.microsoft.com/es-es/library/5ycd1034(v=VS.100).aspx

    dsant.santoral ¿Santoral no es tu datatable?

    Cuando haces cussants.Fill(dsant.santoral) estas internamente haciendo una select. Lo que tienes que realizar es una select con el where de tus textbox. De esta forma esta filtrando la select con los datos que deseas mostrar.

    Saludos,

    martes, 9 de noviembre de 2010 15:20
  • ¡Hola!

    Tal y como lo tienes montado lo mejor es que cambies tu función fill del DataAdapter por otra en la cuál incluyas un where. Sin tener que pensar en LINQ. Pero si quieres hacerlo con LINQ sería algo como esto:

     Dim LFiltrado = (From p In dsant.santoral_
       Where p.campo1="VARIABLETXT1" and p.campo2="VARIABLETXT2"_
       Select p).ToList
    
    grdDatos.ItemsSource=LFiltrado 
    Saludos,
    martes, 9 de noviembre de 2010 15:27
  • Hola,

    de nuevo gracias por el soporte, consejos  y paciencia Corsario,

    dejo enlace de la ventana  de Datagrid  con los texbox y su definición...

                                      http://yfrog.com/f/fximagenventanaj/

    el mensaje anterior del linq es para cargar los datos en el datagrid grdDatos, he canviado el nombre de los campos pero me daba error al cargar....

    como expreso en la imagen anterior, el datagrid me carga correctamente y ordenado gracias a vosotros, lo que deseo es visualizar el campo seleccioando en el datagrid en los texbox para poderlos editar... LO QUE NO ME ACLARO ES COMO HACERLO...

    Gracias  por vuestra paciencia...pero ¿el código como seria?

    creo que lo que deseo en la imagen colgada se visualiza...


    Spandau
    martes, 9 de noviembre de 2010 22:19
  • ¡Hola!

     

    Por fin vemos lo que quieres hacer. Vincular la fila seleccionada a los textbox no sé si se podrá hacer sin pasar por una clase intermedia. Igual te estas liando mucho para una cosa que realmente debería de ser muy sencilla.

    Lo que yo haría es lo siguiente:

    En el evento click del row del Datagrid selecciono la fila. De esta fila consigues los campos y los asignas a los textbox. Olvidate de Blindearlos a los campos. No tiene sentido.

    Por cierto, veo que tienes un ID en la tabla, emplealo para borrar e insertar registros en el datatable (buscas el ID seleccionado y lo borras en el datatable).

    No se te olvide de generar uno nuevo cada vez que insertes un registro. Podrías conseguir el mayor que tienes en el Grid y sumarle uno.

    Saludos,

     

     

     

    miércoles, 10 de noviembre de 2010 15:50
  • cuando tenga tiempo ya buscaré ejemplos...

    supongo que debe ser asi:

      al evento  seleccionchanged o click ->dentro del datagrid he de declarar el row y seleccionarlo  y enlazar con los 2 texbox....

      mirar ejemplos eliminar/añadir filas  a ver si me aclaro..

    Gracias 


    Spandau
    miércoles, 10 de noviembre de 2010 23:09
  • ¡Hola! Ejemplos..... fáciles de conseguir, por eso no te puse: http://msdn.microsoft.com/es-es/library/ms233701.aspx Un saludo
    jueves, 11 de noviembre de 2010 6:09
  • Hola,

    lo de agregar campos, eliminarlos, con los enlaces que me has pasado me tiene que funcionar... ya que ataco contra el dataTable...

    lo que ahora queria hacer era enlazar el datagrid que lo cargo en la linea:

             grdDatos.ItemsSource = DirectCast(View.ToTable(), System.ComponentModel.IListSource).GetList
    

    como  a traves del evento click o SelectionChanged, cojo los campos seleccionados para cargarlos  los 2 texbox que me permite editar? me podrias ayudar no tengo claro a como acceder a los campos del datagrid...?

    Gracias


    Spandau
    jueves, 11 de noviembre de 2010 17:16
  • ¡Hola!

    Sirvase un ejemplo:

    Private Sub grdDatos_SelectionChanged(ByVal sender As Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs) Handles grdDatos.SelectionChanged
    
      Try
    
       If e.AddedItems.Count > 0 Then
        RowSeleccionada = CType(e.AddedItems(0), ClaseFila)
       
    'Siendo RowSeleccionada una propiedad en el mismo UserControl: 
    'Private _RowSeleccionada As New ClaseFila
     'Public Property RowSeleccionada() As ClaseFila
      'Get
       'Return _RowSeleccionada
      'End Get
      'Set(ByVal value As ClaseFila)
       _'RowSeleccionada = value
      'End Set
     'End Property
    'El tipo de la propiedad queda definido en la clase:
    'Public Class ClaseFila
    
    'Pongo algunas propiedades
    
     'Declaración de propiedades
     'Private _ID As Integer
     'Private _Nombre As String
     'Private _Edad As Integer
     'Public Property ID() As Integer
      'Get
       'Return _ID  
     ' End Get
      'Set(ByVal value As Integer)
       '_ID = value
      'End Set
     'End Property
      'Public Property Nombre() As String
      'Get
       'Return _Nombre  'End Get
      ' Set(ByVal value As String)
       ' _Nombre= value
      'End Set
     ' End Property
     'Public Property Edad() As Integer
      'Get
       'Return _Edad
      ' End Get
      'Set(ByVal value As Integer)
       ' _Edad= value
      ' End Set
     'End Property
     'End Class
    
    'Aqui iría la asignación de RowSeleccionada a tus textblock 
    
    End If
    
      Catch ex As Exception
       Er(ex)
      End Try
    
     End Sub
    
    

    Saludos,

    • Marcado como respuesta Spandau sábado, 13 de noviembre de 2010 11:48
    jueves, 11 de noviembre de 2010 20:05