2010-09-22 11 views
7

Creo que el título captura bastante mi pregunta, pero un poco de fondo sigue:¿Por qué BindingList (Of T) no tiene AddRange Member?

Cuando un formulario que tengo carga agrega un par de miles (30k impares) objetos a una lista vinculante. Cuando la aplicación se carga la primera vez, demora varios segundos (alrededor de 10 o más desde la memoria) para recorrer la lista de objetos y agregarla a BindingSource con la función de agregar. Sin embargo, cuando esto sucede en formularios posteriores con el mismo código para cargarlo, solo toma uno o dos segundos.

Entonces mis consultas serían:
1. ¿Por qué BindingList (Of T) no tiene AddRange Member?
2. ¿Las adiciones iniciales y posteriores serían más rápidas con una función AddRange?
3. ¿Alguna idea de por qué una versión del código corre más lento que las versiones idénticas?

Gracias por cualquier ayuda que pueda proporcionar.

+0

¿Se está cargando el formulario cuando se carga la aplicación? ¿Es esa posiblemente la razón de la lentitud? –

+1

Bueno, después de mucho tiempo, finalmente he rastreado un (no estoy seguro de si es el único) problema en DataGridView DefaultRowTemplate ContextMenuProperty. Cuando esto se establece, agrega una cantidad considerable de tiempo cuando agrego elementos al BindingSource subyacente. – ChrisAU

+1

Para referencia futura, me he encontrado con este http://msdn.microsoft.com/en-us/library/ha5xt0d9.aspx usando "Usar menús de acceso directo de manera eficiente". Aprendí esta lección de la manera difícil. – ChrisAU

Respuesta

0

From the OP:

Bueno, después de mucho tiempo, finalmente he rastreado una (no estoy seguro si es el único) a la cuestión DataGridView DefaultRowTemplate ContextMenuProperty. Cuando esto se establece, agrega una cantidad considerable de tiempo cuando agrego elementos al BindingSource subyacente.

Para referencia futura, me he encontrado con este msdn.microsoft.com/en-us/library/ha5xt0d9.aspx utilizando "Uso de menús contextuales de manera eficiente". Aprendí esta lección de la manera difícil.

El enlace de MSDN en el artículo anterior recomienda no utilizar un menú contextual en cada celda, especialmente al poner un menú contextual en la plantilla. En su lugar, el usuario debe crear un solo menú contextual para todo el control o manejar el evento CellContextMenuStripNeeded o RowContextMenuStripNeeded.

1

No estoy seguro de por qué no está disponible el método AddRange. Puede escribir fácilmente el suyo como método de extensión:

/// <summary> 
    /// Adds all the data to a binding list 
    /// </summary> 
    public static void AddRange<T>(this BindingList<T> list, IEnumerable<T> data) 
    { 
     if (list == null || data == null) 
     { 
      return; 
     } 

     foreach (T t in data) 
     { 
      list.Add(t); 
     } 
    } 
Cuestiones relacionadas