2008-10-31 51 views
45

¿Cuál es la mejor manera de actualizar un DataGridView cuando actualiza la fuente de datos base?La mejor manera de actualizar DataGridView cuando actualiza la fuente de datos base

Estoy actualizando el origen de datos con frecuencia y quería mostrar el resultado al usuario en el momento en que sucede.

Tengo algo como esto hecho (y funciona), pero anular el DataGridView.DataSource no parece ser el correcto.

List<ItemState> itemStates = new List<ItemState>(); 
dataGridView1.DataSource = itemStates; 

for (int i = 0; i < 10; i++) { 
    itemStates.Add(new ItemState { Id = i.ToString() }); 
    dataGridView1.DataSource = null; 
    dataGridView1.DataSource = itemStates; 
    System.Threading.Thread.Sleep(500); 
} 

Respuesta

44

Bueno, no hay nada mejor que eso. Oficialmente, se debe utilizar

dataGridView1.DataSource = typeof(List); 
dataGridView1.DataSource = itemStates; 

Es todavía una especie "fuente/reinicio clara" de la solución, pero todavía tengo que encontrar nada más que refrescar la fuente de datos fiable DGV.

+0

Esta es la forma en que lo he estado haciendo durante mucho tiempo y parece funcionar mejor. Hace que todos sus controles de datos enlazados comprueben si sus datos se han actualizado y luego actualizan si es necesario. –

+0

aplausos para validar eso. esperaba que pudiera simplemente cambiar la fuente de datos y luego realizar una actualización de algún tipo.: P simplemente parecía una solución lógica. oh bien – shaunf

+0

¿Cuál es la importancia de usar 'typeof (List)' en su lugar de null? – GWLlosa

-5

probar este Código

List itemStates = new List(); 

for (int i = 0; i < 10; i++) 
{ 
    itemStates.Add(new ItemState { Id = i.ToString() }); 
    dataGridView1.DataSource = itemStates; 
    dataGridView1.DataBind(); 
    System.Threading.Thread.Sleep(500); 
} 
+3

DataBind() es un método ASP .Net para controles de datos. – Tjaart

+2

+ 'Thread.Sleep' !!! = ( – Coops

38

Me encontré con esto yo mismo. Mi recomendación: si tiene la propiedad del origen de datos, no use un List. Use un BindingList. El BindingList tiene eventos que se activan cuando se agregan o cambian elementos, y el DataGridView se actualizará automáticamente cuando se activen estos eventos.

+4

Esta es una buena sugerencia. Después de eso, solo tiene que llamar a .Refresh() para que la vista de cuadro de datos actualice sus datos ... – veljkoz

+2

puede actualizar fila por fila usando: bindingList.ResetItem (bindingList.IndexOf (item)); –

+2

'.Refresh()' solo habla del rediseño de control, nada que ver con enlaces a menos que esté muy equivocado. "Obliga al control a invalidar su área de cliente e inmediatamente se redibuja a sí mismo y a cualquier control secundario". [Control.Refresh Method] (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.refresh.aspx) – Coops

0

Esto es copia mi respuesta del THIS lugar.

sólo tiene que rellenar la cuadrícula de datos de nuevo como esto:

this.XXXTableAdapter.Fill(this.DataSet.XXX); 

Si utiliza automaticlly se conectan desde dataGridView este código crear automaticlly en Form_Load()

2

ObservableCollection: Representa una colección de datos dinámica que ofrece notificaciones cuando los elementos se agregan, eliminan o cuando se actualiza toda la lista. Puede enumerar sobre cualquier colección que implemente la interfaz IEnumerable. Sin embargo, para establecer enlaces de dinámicas de modo que inserciones o deleciones de la colección actualizar la interfaz de usuario de forma automática, la colección debe implementar la interfaz INotifyCollectionChanged. Esta interfaz expone el evento CollectionChanged, , un evento que debe plantearse cada vez que cambia la colección subyacente.

Observablecollection<ItemState> itemStates = new Observablecollection<ItemState>(); 

for (int i = 0; i < 10; i++) { 
    itemStates.Add(new ItemState { Id = i.ToString() }); 
    } 
dataGridView1.DataSource = itemStates; 
-1

Está configurando el origen de datos dentro del bucle y durmiendo 500 después de cada agregación. ¿Por qué no simplemente agregar a los estados del elemento y luego establecer su fuente de datos DESPUÉS de haber agregado todo? Si quieres que el hilo duerma después de eso, bien. El primer bloque de código aquí es tuyo, el segundo bloque que modifiqué.

for (int i = 0; i < 10; i++) { 
    itemStates.Add(new ItemState { Id = i.ToString() }); 
    dataGridView1.DataSource = null; 
    dataGridView1.DataSource = itemStates; 
    System.Threading.Thread.Sleep(500); 
} 

cambiar el código de la siguiente manera: esto es mucho más rápido.

for (int i = 0; i < 10; i++) { 
    itemStates.Add(new ItemState { Id = i.ToString() }); 

} 
    dataGridView1.DataSource = typeof(List); 
    dataGridView1.DataSource = itemStates; 
    System.Threading.Thread.Sleep(500); 
2

El más eficiente y paradigma de usar solución más limpia, en este caso es utilizar un System.Windows.Forms.BindingSource como un proxy entre la lista de elementos (fuente de datos) y su DataGridView:

var itemStates = new List<ItemState>(); 
var bindingSource1 = new System.Windows.Forms.BindingSource { DataSource = itemStates }; 
dataGridView1.DataSource = bindingSource1; 

Entonces, cuando añadir elementos, utilizan Add() método de BindingSource en lugar de Add() método de su lista:

for (var i = 0; i < 10; i++) 
{ 
    bindingSource1.Add(new ItemState { Id = i.ToString() }); 
    System.Threading.Thread.Sleep(500); 
} 

Thi La forma en que agrega elementos a su lista y notifica al DataGridView acerca de esas adiciones con la misma línea de código. No es necesario restablecer DataGridView 's DataSource cada vez que realice un cambio en la lista.

También vale la pena mencionar que se puede soltar un BindingSource en su formulario directamente en el Diseñador de formularios de Visual Studio y adjuntarlo como un origen de datos al DataGridView allí también, lo que le ahorra una línea de código en el ejemplo anterior donde Lo estoy haciendo de forma manual.

+1

Esta respuesta debería haber recibido el indicador de respuesta correcta. Mi voto va aquí. – jsa

+0

@jsa: Desafortunadamente, OP no ha estado visitando SO desde 2009. –

+1

Definitivamente la mejor respuesta, una lástima que el otro haya recibido tantos votos, pero ha tardado mucho más en recopilarlos, ¡a juzgar por las fechas! – Billious

Cuestiones relacionadas