una seleccionar seleccionada posicionarse por obtener modificar fila despues datos dato como codigo celda buscar automaticamente agregar actualizar c# winforms datagridview

c# - seleccionar - Cómo guardar la posición después de volver a cargar DataGridView



seleccionar una celda de un datagridview c# (10)

Actualmente, está cargando los datos cada vez que se carga la página. Yo sugeriría usar la propiedad Page.IsPostback para verificar y ver si es una devolución 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.

este es mi codigo

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 volver a cargar los datos en el clic del botón 1, la selección de celdas salta en la primera columna y las barras de desplazamiento se restablecen. ¿Cómo guardar la posición de DataGridView?


Aquí está la solución que se me ocurrió. No requiere que se seleccione una fila y coloca 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 && dataGridView1.FirstDisplayedCell != null) saveRow = dataGridView1.FirstDisplayedCell.RowIndex; dataGridView1.DataSource = dataTable1; if (saveRow != 0 && saveRow < dataGridView1.Rows.Count) dataGridView1.FirstDisplayedScrollingRowIndex = saveRow;


En otro foro, encontré 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"); }


Esto lo hace porque está restableciendo o volviendo a afectar la propiedad DataSource de su control DataGridView.

Para poder realizar lo que desea, debe guardar el índice CurrentItem en una variable local antes de restablecer la propiedad DataSource de su DataGridView. Sin embargo, hacerlo implica que sabe que va a tener la misma cantidad de datos o más, de lo contrario, saldrá con una excepción IndexOutOfRangeException que intentará pasar a un índice mayor que la cantidad de datos realmente contenida en su DataGridView.

Por lo tanto, si desea guardar el índice de su fila o celda, deberá pasar por las propiedades de control de DataGridView ya que su BindingSource no entregará dicha característica.

En un DataGridView, la fila seleccionada y la fila actual (indicadas por una flecha en el encabezado de la fila) pueden no 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 siempre se seleccionará. Si desea cambiar la fila actual en un control DataGridView, puede establecer la propiedad CurrentCell

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

Si solo desea cambiar la fila seleccionada, puede establecer la propiedad Seleccionada de la fila que desea que sea verdadera.

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


Hice algo como esto.

  1. Guardar FirstDisplayedCell y CurrentCell seleccionados
  2. Refrescar
  3. Establecer la fila anterior de dataGridView y la fila seleccionada anterior

    // Declarar variables int rowIndex = 0; int saveRow = 0;

    if(dataGridView1.SelectedRows.Count > 0) { rowIndex = dataGridView1.CurrentCell.RowIndex; saveRow = dataGridView1.FirstDisplayedCell.RowIndex; } //REFRESH CODE HERE if(dataGridView1.SelectedRows.Count > 0) { dataGridView1.FirstDisplayedScrollingRowIndex = saveRow; dataGridView1.CurrentCell = dataGridView1.Rows[rowIndex].Cells[0]; }


La forma 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];


La respuesta de @ ovinophile ayudó, por supuesto, pero no abordó el desplazamiento horizontal de DataGridView para mí. Aprovechando la respuesta de @ ovinophile, esto funciona bien para mantener 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;


Podemos usar el evento SelectionChanged de DataGridView para rastrear la fila seleccionada. El problema es que cuando se vuelve a vincular el origen de datos, el CurrentRow.Index se restablece a cero.

Podemos manejar esto separándonos del evento SelectionChanged antes de vincular nuestra fuente de datos y volver a adjuntarlo al evento después de vincular nuestra fuente de datos.

// Detach Event dataGridView1.SelectionChanged -= dataGridView1_SelectionChanged; // Bind Data bindingSource.DataSource = data; // or dataGridView1.DataSource = data; // Set Selected Row dataGridView1.Rows[LastSelectedRowIndex].Selected = true; // Re-attach Event dataGridView1.SelectionChanged += dataGridView1_SelectionChanged;

El evento para rastrear el índice seleccionado es simple.

int LastSelectedRowIndex = 0; private void dataGridView1_SelectionChanged(object sender, EventArgs e) { LastSelectedRowIndex = dataGridView1.CurrentRow.Index; }

Esto es para darte una idea del concepto.

Mantener la selección con un valor clave único

Generalmente, cuando estamos volviendo a vincular información a una fuente de datos, esto se debe a que la información ha cambiado. Si el tamaño del conjunto de datos ha cambiado, esto significa que los índices de sus filas también cambiarán.

Es por esto que no debemos confiar en LastSelectedRowIndex para mantener la fila seleccionada. En su lugar, deberíamos usar una clave única en la fuente de datos.

Nuestro evento SelectionChanged se convierte en el siguiente.

// KeyIndex is the Unique Key column within your dataset. int KeyIndex = 2; string LastSelectedKey = string.Empty; private void dataGridView1_SelectionChanged(object sender, EventArgs e) { LastSelectedKey = dataGridView1.CurrentRow.Cells[KeyIndex].Value.ToString(); }

Y en lugar de configurar la fila seleccionada de DataGridView por índice, podemos establecerla por nuestro valor clave.

// Set Selected Row // If we need to scroll the selected row into view // this would be a good place to set FirstDisplayedScrollingRowIndex foreach (DataGridViewRow row in dataGridView1.Rows) if (row.Cells[KeyIndex].Value.ToString() == LastSelectedKey) row.Selected = true;


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

En esta pregunta , respondí cómo seleccionar una fila específica en un DataGridView.

Edit: Supongo que estás usando WinForms

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

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

DataGridView.FirstDisplayedCell.RowIndex


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