2010-03-14 15 views
13

este es mi código:Cómo ahorrar posición después de DataGridView recarga

 private void getData(string selectCommand) 
    { 
     string connectionString = @"Server=localhost;User=SYSDBA;Password=masterkey;Database=C:\data\test.fdb"; 

     dataAdapter = new FbDataAdapter(selectCommand, connectionString); 
     DataTable data = new DataTable(); 
     dataAdapter.Fill(data); 
     bindingSource.DataSource = data; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     getData(dataAdapter.SelectCommand.CommandText); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     dataGridView1.DataSource = bindingSource; 
     getData("SELECT * FROM cities"); 
    } 

después de los datos de recarga en el botón 1 clic, la selección de células saltos en la primera columna y barras de desplazamiento se pone a cero. ¿Cómo guardar la posición de DataGridView?

Respuesta

3

Puede guardar la fila seleccionada antes de iniciar getData, utilizando DataGridView.CurrentRow, y seleccionar esa fila después de que se haya cargado la Grilla.

En this question respondí cómo seleccionar una fila específica en un DataGridView.


Editar: que supone que está utilizando Windows Forms

Edit2: Y qué pasa con las barras de desplazamiento?

puede guardar el primer índice de fila visible, también con esta declaración

DataGridView.FirstDisplayedCell.RowIndex 
0

Actualmente, se está cargando el cada vez de los datos que se carga la página. Sugeriría usar la propiedad Page.IsPostback para verificar y ver si es una devolución de datos o no.

if(!Page.IsPostback) 
{ 
    dataGridView1.DataSource = bindingSource; 
    getData("SELECT * FROM cities"); 
} 

Esto reducirá la cantidad de carga en su base de datos y dejará de causar problemas con sus selecciones.

+0

Esta propiedad Page.IsPostBack sólo es válida para las aplicaciones ASP.NET. Estamos hablando de WinForms. –

0

Esto se debe a que está restableciendo o reafectando la propiedad DataSource de su control DataGridView.

Para realizar lo que desee, debe guardar el índice CurrentItem en una variable local antes de restablecer la propiedad DataSource de su DataGridView. Sin embargo, hacerlo implica que usted sabe que va a tener la misma cantidad de datos o más, de lo contrario obtendrá IndexOutOfRangeException intentando pasar a un índice mayor que la cantidad de datos que realmente contiene su DataGridView.

Por lo tanto, si desea guardar el índice de su fila o celda, deberá hacerlo a través de las propiedades del control DataGridView ya que su BindingSource no entregará dicha función.

En un DataGridView, la fila seleccionada y la fila actual (indicado por una flecha en el encabezado de la fila) no puede ser la misma fila. Además, podríamos seleccionar varias filas en un DataGridView pero la fila actual solo puede ser una fila . Cuando la propiedad SelectionMode de DataGridView se establece en FullRowSelect, la fila actual será siempre seleccionada. Si desea cambiar la fila actual en un control DataGridView , es posible establecer la propiedad currentCell

dataGridView1.CurrentCell = dataGridView1.Rows[1].Cells[0]; 

Si desea cambiar sólo la fila seleccionada, es posible establecer el Seleccionado propiedad de la fila que quiere que sea verdadera.

dataGridView1.CurrentRow.Selected = false; 
dataGridView1.Rows[1].Selected = true; 
+0

¿Y con las barras de desplazamiento? Si el usuario simplemente desplaza la cuadrícula de datos sin seleccionar una celda. – bobik

+0

Entonces, ni DataGridView ni BindingSource pueden identificar dónde se desplaza el usuario. Cuando carga datos y los establece en la propiedad DataSource de su DataGridView, le dice al WinForm que actualice sus datos y luego todo se reinicia. No conozco otra manera con una celda o fila seleccionada. Windows mismo no se comporta de manera diferente. –

+0

@bobk, respondo esto en mi publicación, en la última edición. – Javier

1

En otro foro, he encontrado una solución sin ninguna manipulación:

private void getData(string selectCommand) 
    { 
     string connectionString = @"Server=localhost;User=SYSDBA;Password=masterkey;Database=C:\data\test.fdb"; 

     dataAdapter = new FbDataAdapter(selectCommand, connectionString); 
     data = new DataTable(); 
     dataAdapter.Fill(data); 
     bindingSource.DataSource = data; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     dataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey; 
     dataAdapter.Fill(data); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     dataGridView1.DataSource = bindingSource; 
     getData("SELECT * FROM cities"); 
    } 
31

Aquí está la solución que se me ocurrió. No requiere que se seleccione una fila y vuelve a colocar la barra de desplazamiento en la misma área después de la actualización, siempre que el número de filas no varíe mucho.

int saveRow = 0; 
if (dataGridView1.Rows.Count > 0) 
    saveRow = dataGridView1.FirstDisplayedCell.RowIndex; 

dataGridView1.DataSource = dataTable1; 

if (saveRow != 0 && saveRow < dataGridView1.Rows.Count) 
    dataGridView1.FirstDisplayedScrollingRowIndex = saveRow; 
+0

Exactamente lo que necesitaba, me parece la respuesta :) – Jacco

+0

@ovinophile ¿cómo lograr este compañero con la cuadrícula de datos? no con datagridview? –

+0

Probé este y lo puse en un temporizador de 100ms que contiene mi recarga datagridview desde la base de datos y este código que guarda la fila en la que estoy ... Y estoy teniendo un error de referencia nulo ... ¿Cómo puedo solucionar eso? –

4
int FirstDisplayedScrollingRowIndex = this.dgvItems.FirstDisplayedScrollingRowIndex; //Save Current Scroll Index 
int SelectedRowIndex = 0; 
if (this.dgvItems.SelectedRows.Count > 0) SelectedRowIndex = this.dgvItems.SelectedRows[0].Index; //Save Current Selected Row Index 

//REFRESH DataGridView HERE 

if ((FirstDisplayedScrollingRowIndex >=0) && ((this.dgvItems.Rows.Count -1) >= FirstDisplayedScrollingRowIndex)) this.dgvItems.FirstDisplayedScrollingRowIndex = FirstDisplayedScrollingRowIndex; //Restore Scroll Index 
if ((this.dgvItems.Rows.Count -1) >= SelectedRowIndex) this.dgvItems.Rows[SelectedRowIndex].Selected = true; //Restore Selected Row 
+0

Probé el código de la respuesta anterior y lo puse en un temporizador de 100 ms que me da un Error de referencia nulo en mi DataGridView ... Si utilizo el formato de código en su lugar, ¿se solucionará el Error de referencia nulo? –

+0

Un error de referencia nulo es bastante genérico, es difícil decir cuál es el problema. Este código no se escribió para ejecutarse dentro de un temporizador, por lo que ese puede ser su problema. Pruébelo sin el temporizador primero y trabaje desde allí. –

+0

Funciona sin ningún error de referencia nulo sin un temporizador. Alguien me dijo que tal vez es porque los 100ms. el temporizador se ejecuta demasiado rápido que ni siquiera se llama aún a datagridview. Así que traté de aumentar el temporizador a 1 segundo y el error de referencia nulo en el inicio se ha ido, pero no del todo porque hay algunos momentos en los que aparece un error de referencia nulo de nuevo. –

3

La manera más fácil es el código Blow:

int CurrentRowIndex = (hSuperGrid1.CurrentRow.Index); 

////after Fill The DataGridView 

hSuperGrid1.ClearSelection(); 
hSuperGrid1.CurrentRow.Selected = false; 

hSuperGrid1.Rows[CurrentRowIndex].Selected = true; 

hSuperGrid1.CurrentCell = hSuperGrid1[0, CurrentRowIndex]; 
2

@ respuesta de ovinophile ayudó a salir, a ciencia cierta, pero no se refirió al desplazamiento horizontal de la DataGridView para mí. Que llevan a cuestas sobre la respuesta de @ ovinophile, esto está funcionando bien para mantener tanto la posición de desplazamiento horizontal y vertical:

// Remember the vertical scroll position of the DataGridView 
int saveVScroll = 0; 
if (DataGridView1.Rows.Count > 0) 
    saveVScroll = DataGridView1.FirstDisplayedCell.RowIndex; 

// Remember the horizontal scroll position of the DataGridView 
int saveHScroll = 0; 
if (DataGridView1.HorizontalScrollingOffset > 0) 
    saveHScroll = DataGridView1.HorizontalScrollingOffset; 

// Refresh the DataGridView 
DataGridView1.DataSource = ds.Tables(0); 

// Go back to the saved vertical scroll position if available 
if (saveVScroll != 0 && saveVScroll < DataGridView1.Rows.Count) 
    DataGridView1.FirstDisplayedScrollingRowIndex = saveVScroll; 

// Go back to the saved horizontal scroll position if available 
if (saveHScroll != 0) 
    DataGridView1.HorizontalScrollingOffset = saveHScroll; 
+0

Estoy actualizando mi DataGridView usando una función que ejecuta una consulta SQL desde mi base de datos en su lugar ... Si pongo mi función de recarga en lugar de 'DataGridView1.DataSource = ds.tables (0)' en su formato de código, trabajo para mi también? –

Cuestiones relacionadas