none
Cargar resultado consulta linq en un listbox RRS feed

  • Pregunta

  • Hola compàñeros,
    estoy haciendo una aplicacion y tengo problemas en cargar los valores de una consulta a un listbox... he estado haciendo pruebas a través de un datatemplate pero no me acaba de funcionar.... hay algun lugar con ejemplos o alguien me puede 'orientar' ?
    Gracias por adelantado
    jueves, 3 de septiembre de 2009 9:22

Respuestas

  • Hola,
    Cuando haces tu consulta éste te regresa una collection genérica, la cual puedes convertir a un elemento IList o ICollection, algo así:
    generalas la propiedad

    private List<CustomType> _myList;
    public List<CustomTyp> myList{ get { return _myList; } }

    var query = from entities in dataContext.TableWii
                      select entities;

    _myList = new List<CustomType>();

    myList.AddRange(query.ToList()); //este es el que asignaras a tu listbox para hacer el binding de los elementos, es decir,
    en lugar de hacerlo directamente a la collection que genera la consulta linq hacer un cast de esta consulta a otra collection, y ahora si jugar con esta última.

    Cuando implementes la interfaz ICollectionView generas esta utilizando el List<CustomType>.

    ICollectionView myview = CollectionViewSource.GetDefaultView(myList);
    myview.MoveCurrentTo(mylist[2]); //esto lo que hará es que seleccione el segundo elemento de la lista y además de tu ListBox (si tiene la propiedad IsSynchronizedWithCurrent en true)

    ya que hiciste todo esto en tu código C# ahora pasas a XAML y en éste a tu Listbox le agregas la propiedad:

    <ListBox ItemsSource={Binding Path=myList} ...>

    Ahora para un mejor manejo de tu dataTemplate te recomiendo agregar la propiedad DataType={x:Type CustomType}
    Donde customType es el tipo de dato que genera tu consulta en Linq
    Microsoft Certified Technology Specialist .NET 3.5 WPF Application Development
    Profesionista Microsoft VIP México
    Blog Técnico
    World Wide Finalist Imagine Cup 2007
    Microsoft Student Partner
    C#, WPF, WCF
    LinkedIn
    • Marcado como respuesta Spandau domingo, 13 de septiembre de 2009 21:11
    viernes, 4 de septiembre de 2009 15:10

Todas las respuestas

  • Te pongo un ejemplo imagina que tenemos la clase Songs donde tenemos las canciones.

    El XAML del DataTemplate

    <Window.Resources>
      <!-- Data template for the listbox items -->
      <DataTemplate x:Key="SongsTemplate">
        <StackPanel>
          <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding Path=Name}" FontWeight="Bold" />
            <TextBlock Margin="5,0,0,0" Text="{Binding Path=Duration}"/>
          </StackPanel>
          <TextBlock Text="{Binding Path=Album.Name}" />
        </StackPanel>
      </DataTemplate>
    </Window.Resources>


    El de la listBox

    ListBox HorizontalAlignment="Stretch" Margin="5" Name="listBox1"
        VerticalAlignment="Stretch" HorizontalContentAlignment="Stretch"
        ItemTemplate="{StaticResource SongsTemplate}"/>

    Ahora para asignarle los datos con LinqToSql

    BeatlesDataContext dc = new BeatlesDataContext();

    var query = from s in dc.Songs
                select s;

    dataListBox.ItemsSource = query.OrderBy(s =>s.Album.Name).ToList();

    Luego puedes crear tu Template mas complejo con converter, multibinding...

    El ejemplo completo lo tienes en

    http://www.codeproject.com/KB/WPF/wpfviews.aspx

    Oscar Avarez Guerras - Arquitecto Software en I3B (I+D+I) Blog:http://geeks.ms/blogs/oalvarez Por favor marca como respuesta si te ha ayudado esta respuesta
    jueves, 3 de septiembre de 2009 11:30
  • Hola bialguos,
    he intentado bajarme el ejemplo pero esta en C# y no se me carga...
    he  estado probando con el codigo colgado anteriormente, es bastante parecido a como lo tenia... pero no acabo de ver la declaracion del objeto dataListbox:

    dataListBox.ItemsSource = query.OrderBy(s =>s.Album.Name).ToList();

    jueves, 3 de septiembre de 2009 14:24
  • habría que ver como es tu modelo, pero asumo que lo tienes en code behind, así que:

    en tu código de tu ventana Window1.xaml agregas tu propiedad publica de la lista de elementos que deseas bindear.

    public List<MyItem> MyItems {get; set; }

    en tu xaml en listbox:

    <ListBox ItemsSource={Binding MyItems, Mode=TwoWay} ItemTemplate={DynamicResource myItemsTemplate}..../>

    en tu App.xaml o en el windows resources el data template:

    <DataTemplate x:Key="myItemsTemplate" DataType="{x:Type MyItem}">
    ...
    </DataTemplate>

    Ojo, el tipo de tu data template debe ser igual al de tu lista MyItems.

    Ahora si deseas ajustar u ordenar los elementos dentro del ListBox te recomiendo usar el ICollectionView interface.

    así podrás hacerl el filter, grouping, sorting etc etc

    intentá en alguna parte de tu código:

    ICollectionView myview = CollectionViewSource.GetDefaultView(this.MyItems);

    ListSortDirection direction = ListSortDirection.Descending;

    using (myview.DeferRefresh()){
    myview.SortDescriptions.Clear();
    myview.SortDescriptions.Add(new SortDescription("Nombre", direction);

    en el sort description el "Nombre" es una propiedad de tu entidad, puede ser Id, ApellidoPaterno o lo que gustes.

    Saludos,
    Rodrigo

    Microsoft Certified Technology Specialist .NET 3.5 WPF Application Development
    Profesionista Microsoft VIP México
    Blog Técnico
    World Wide Finalist Imagine Cup 2007
    Microsoft Student Partner
    C#, WPF, WCF
    LinkedIn
    jueves, 3 de septiembre de 2009 18:04
  • Hola irodfraga,
    con el ICollectionView interface me has dejado 'fuera de juego'... he estado mirando por internet y la informacion la he encontrado en inglés...
    pongo mi codigo porque debe ser una  tonteria:

    codigo xaml en la ventana donde deseo mostrar resultado consulta linq:
     <ListBox HorizontalAlignment="Stretch" Name="ListBox1" Margin="5" VerticalAlignment="Stretch" ItemTemplate="{StaticResource DataTemplateLListarCercaPersonalitzada}" />
    
    el datatempalte:
    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <DataTemplate x:Key="DataTemplateLListarCercaPersonalitzada" >
            <StackPanel Orientation="Horizontal" >
                <TextBlock  Text="Binding Path=nom}" />
                <TextBlock  Text="  Binding Path=cognom}"/>
                <TextBlock  Text=" Binding Path=data_naixement}"/>
                <TextBlock   Text="Binding Path=data_sant}"/>  
            </StackPanel>
      </DataTemplate>
    </ResourceDictionary>

    tambien tengo declarado el diccionario en application.xaml
    y en la ventana  vb donde quiero el listbox tengo la consulta linq que me devuelve los 4 campos de los registros que cumplen las condiciones....
    la duda/problema es como relaciono la consulta LINQ con el listbox/datatemplate....
    Gracias


    jueves, 3 de septiembre de 2009 23:22
  • Hola,
    Cuando haces tu consulta éste te regresa una collection genérica, la cual puedes convertir a un elemento IList o ICollection, algo así:
    generalas la propiedad

    private List<CustomType> _myList;
    public List<CustomTyp> myList{ get { return _myList; } }

    var query = from entities in dataContext.TableWii
                      select entities;

    _myList = new List<CustomType>();

    myList.AddRange(query.ToList()); //este es el que asignaras a tu listbox para hacer el binding de los elementos, es decir,
    en lugar de hacerlo directamente a la collection que genera la consulta linq hacer un cast de esta consulta a otra collection, y ahora si jugar con esta última.

    Cuando implementes la interfaz ICollectionView generas esta utilizando el List<CustomType>.

    ICollectionView myview = CollectionViewSource.GetDefaultView(myList);
    myview.MoveCurrentTo(mylist[2]); //esto lo que hará es que seleccione el segundo elemento de la lista y además de tu ListBox (si tiene la propiedad IsSynchronizedWithCurrent en true)

    ya que hiciste todo esto en tu código C# ahora pasas a XAML y en éste a tu Listbox le agregas la propiedad:

    <ListBox ItemsSource={Binding Path=myList} ...>

    Ahora para un mejor manejo de tu dataTemplate te recomiendo agregar la propiedad DataType={x:Type CustomType}
    Donde customType es el tipo de dato que genera tu consulta en Linq
    Microsoft Certified Technology Specialist .NET 3.5 WPF Application Development
    Profesionista Microsoft VIP México
    Blog Técnico
    World Wide Finalist Imagine Cup 2007
    Microsoft Student Partner
    C#, WPF, WCF
    LinkedIn
    • Marcado como respuesta Spandau domingo, 13 de septiembre de 2009 21:11
    viernes, 4 de septiembre de 2009 15:10
  • Hola compàñeros,
    estoy haciendo una aplicacion y tengo problemas en cargar los valores de una consulta a un listbox... he estado haciendo pruebas a través de un datatemplate pero no me acaba de funcionar.... hay algun lugar con ejemplos o alguien me puede 'orientar' ?
    Gracias por adelantado


    Espero les sirva aunquese algo tarde

     

     Dim Connection As SqlConnection
            Dim Command As SqlCommand
            Dim Clave As Integer


            Clave = DropDownList4.SelectedValue
            'ListBox1.Items.Clear()

            Dim dr As SqlDataReader

            Try
                Connection = New SqlConnection(ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString)
                Command = New SqlCommand()
                Command.Connection = Connection
                Command.CommandType = CommandType.StoredProcedure
                Command.CommandText = "Sp_CIAC_EmpleadoCopiaEmpleado"
                Command.Parameters.Add("@IdEmpleado", SqlDbType.Int)
                Command.Parameters("@IdEmpleado").Value = CInt(Clave)
                Command.Connection.Open()
                dr = Command.ExecuteReader
                While dr.Read
                    ListBox1.Items.Add(dr.Item("Nombre_Completo"))
                End While
                Command.Connection.Close()
            Catch ex As Exception
                ScriptManager.RegisterStartupScript(Page, GetType(Page), "msg", "Javascript:AlertaUsuario('ERROR');", True)
            End Try

     

    miércoles, 19 de enero de 2011 19:55