none
Problema al asignar resultados de consulta al ItemsSource de un ListView - Error Ínice fuera de los límites de la Matriz RRS feed

  • Pregunta

  • Hola, necesito de su ayuda compañeros, estoy usando WPF, LinQ y C#. Tengo dos consultas en LinQ, en la primer consulta obtengo N registros, especificamente ID's y estos los guardo en un Array de enteros cuando recorro la consulta dentro de un foreach, y en este foreach hago la segunda consulta, dónde en la condición de esta consulta ocupo cada uno de los ID's que voy obteniendo más lo que se teclea en un textbox mediante Contains,  el problema viene cuando quiero asignar el resultado de esta segunda consulta al ItemsSource de un ListView.
    Si asigno la variable de la consulta al ItemsSource dentro del foreach funciona, pero solo asigna los resultados que encuentré con el último ID del array y no con los anteriores, es decir, si el array donde guarde los ID's de la primer consulta son 2, el ItemsSource del ListView solo toma los resultados de la segunda consulta para el último ID del array pero no para los resultados del primer elemento del array. Mi código esta así:

    int[] a;//array dónde guardo los ID's de mi primer consulta
    
    var query1 = from p in miDataContext.MiTablaUno
                where p.idProyecto == 7 select p;
                int numRows = query1.Count();
                a = new int[numRows];
                int contador = 0;
    
    foreach (var w in query1) {
            a[cntadr] = ww.idCuenta.Value;
    
        var qry = from d in miDataContext.MiTablaDos
                  where d.Nombre.Contains(miTextBox.Text) &&
                  d.idCuen.Value == a[contador] select d;
    
         miListView.ItemsSource = qry;
         contador++;
    }
    
    miListView.SelectedValuePath = "idProdGral";
    miListViewwProd.DisplayMemberPath = "NombreGral";
    miListView.Visibility = Visibility.Visible;

    ¿alguien sabe qué puedo hacer para poder asignar todos los resultados que obtenga en la segunda consulta de cada ID que tenga mi array al ItemsSource de mi ListView?

    También intenté asignar el resultado de la segunda consulta a un ArrayList de esta forma:

    int[] a;
    ArrayList miArray = new ArrayList();
    
    var query1 = from p in miDataContext.MiTablaUno
                where p.idProyecto == 7 select p;
                int numRows = query1.Count();
                a = new int[numRows];
                int contador = 0;
    
    foreach (var w in query1) {
            a[cntadr] = ww.idCuenta.Value;
            var qry = from d in miDataContext.MiTablaDos
            where d.Nombre.Contains(miTextBox.Text) &&
            d.idCuen.Value == a[contador] select d;
    
            miArray.Add(qry);
            contador++;
    }
    
    miListView.ItemsSource = miArray;/*en esta linea me muestra un error de índice fuera de los límites de la matriz*/
    miListView.SelectedValuePath = "idProdGral";
    miListViewwProd.DisplayMemberPath = "Nombre";
    miListView.Visibility = Visibility.Visible;
    

    Pero me tira el error de índice fuera de los límites de la matriz, no sé por qué me ocurré esto, ¿podrían orientarme para poder asignar en el itemsSource de mi listView todos los resultados de mi segunda consulta para cada uno de los ID's y lo que se teclea?

    De antemano muchas gracias, saludos.

    domingo, 12 de mayo de 2013 21:56

Todas las respuestas

  • Una consulta linq como tu segunda consulta:

     var qry = from d in miDataContext.MiTablaDos
                  where d.Nombre.Contains(miTextBox.Text) &&
                  d.idCuen.Value == a[contador] select d;

    Es "justamente eso" la definición de una consulta, pero no obtienes su resultado hasta que se necesita realmente. Esto se define como ejecución diferida. A primera vista tu código no ejecuta esta consulta hasta que el ListView pide el ItemSource y esto es posible que no sea lo que quieres.

    Prueba a forzar la "materialización" de la consulta de esta forma:

     var qry = (from d in miDataContext.MiTablaDos
                  where d.Nombre.Contains(miTextBox.Text) &&
                  d.idCuen.Value == a[contador] select d).ToList();

    Así obtendrás el resultado de ejecutar la consulta en cada iteración del bucle foreach.


    Un saludo. Miguel A. González
    _________________________
    Si la respuesta es correcta, marcala como correcta. También puedes votar como útil si te ha sido de ayuda

    lunes, 13 de mayo de 2013 8:03