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.
- Guardar FirstDisplayedCell y CurrentCell seleccionados
- Refrescar
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