C'è un modo per mantenere selezionate le celle di un DataGridView dopo la modifica di DataSource?DataGridView: mantenere le selezioni dopo la modifica dell'origine dati?
risposta
È possibile abbinare ciò che deve essere selezionato in base a criteri specifici per le proprie esigenze e basta impostare la proprietà Select della cella o della riga su true/false a seconda della corrispondenza. Ecco un semplice esempio che puoi inserire in un progetto winforms appena creato che illustrerà il punto. Per questo esempio, assicurati di aver impostato SelectionMode di DataGridView = FullRowSelect. Se si desidera mantenere/riapplicare selezioni di celle, l'approccio sarebbe simile. Nota: si potrebbe anche solo mantenere un elenco di indici di riga selezionati, ma questo in genere non avrebbe senso quando si carica un'altra fonte di dati poiché di solito è improbabile che ci sia una corrispondenza tra le righe effettive e la loro posizione fisica nei dati.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace DataGridViewRetainSelection
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private readonly List<Person> currentPeople = new List<Person>();
private bool dummyToggle = true;
private void Form1_Load(object sender, EventArgs e)
{
SwitchDataSource(); // will just new up the datasource
}
private void ButtonSwitchDataSourceClick(object sender, EventArgs e)
{
SwitchDataSource();
}
private void SwitchDataSource()
{
var selectedPeople = (from DataGridViewRow row in dataGridViewPeople.Rows where row.Selected select currentPeople[row.Index]).ToList();
peopleBindingSource.DataSource = null;
currentPeople.Clear();
if (dummyToggle)
{
currentPeople.Add(new Person { Name = "Joel Spolsky" });
currentPeople.Add(new Person { Name = "Jeff Atwood" });
currentPeople.Add(new Person { Name = "Jarrod Dixon" });
currentPeople.Add(new Person { Name = "Geoff Dalgas" });
currentPeople.Add(new Person { Name = "Brent Ozar" });
}
else
{
currentPeople.Add(new Person { Name = "Joel Spolsky" });
currentPeople.Add(new Person { Name = "Jeff Atwood" });
currentPeople.Add(new Person { Name = "Brent Ozar" });
}
dummyToggle = !dummyToggle;
peopleBindingSource.DataSource = currentPeople;
foreach (var person in selectedPeople)
{
foreach (DataGridViewRow row in dataGridViewPeople.Rows)
{
if (string.Equals(row.Cells[0].Value, person.Name))
{
row.Selected = true;
}
}
}
}
}
public sealed class Person
{
public string Name { get; set; }
}
}
Per implementare la stessa funzionalità per celle selezionate, fare qualcosa di simile al seguente. Sto lasciando il codice precedente se altri ne hanno bisogno. Nota: sto sbattendo un tipo anonimo qui, probabilmente dovrai fare qualcosa di un po 'più sofisticato a seconda dei campi membri, delle proprietà, ecc. Ma il principio generale di impostare le celle selezionate è illustrato correttamente e può facilmente essere testato e debug per capire spero.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace DataGridViewRetainSelection
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private readonly List<Person> currentPeople = new List<Person>();
private bool dummyToggle = true;
private void Form1_Load(object sender, EventArgs e)
{
dataGridViewPeople.SelectionMode = DataGridViewSelectionMode.CellSelect;
SwitchDataSource(); // will just new up the datasource
}
private void ButtonSwitchDataSourceClick(object sender, EventArgs e)
{
SwitchDataSource();
}
private void SwitchDataSource()
{
var selectedPeopleAndCells = (from DataGridViewCell cell in dataGridViewPeople.SelectedCells where cell.Selected select new { Person = currentPeople[cell.RowIndex], Cell = cell }).ToList();
peopleBindingSource.DataSource = null;
currentPeople.Clear();
if (dummyToggle)
{
currentPeople.Add(new Person { Name = "Joel Spolsky", Id = 0 });
currentPeople.Add(new Person { Name = "Jeff Atwood", Id = 1 });
currentPeople.Add(new Person { Name = "Jarrod Dixon", Id = 2 });
currentPeople.Add(new Person { Name = "Geoff Dalgas", Id = 3 });
currentPeople.Add(new Person { Name = "Brent Ozar", Id = 4 });
}
else
{
currentPeople.Add(new Person { Name = "Joel Spolsky", Id = 0 });
currentPeople.Add(new Person { Name = "Jeff Atwood", Id = 1 });
currentPeople.Add(new Person { Name = "Brent Ozar", Id = 4 });
}
dummyToggle = !dummyToggle;
peopleBindingSource.DataSource = currentPeople;
foreach (var personAndCell in selectedPeopleAndCells)
{
foreach (DataGridViewRow row in dataGridViewPeople.Rows)
{
if (string.Equals(row.Cells[0].Value, personAndCell.Person.Id))
{
row.Cells[personAndCell.Cell.ColumnIndex].Selected = true;
}
}
}
}
}
public sealed class Person
{
public int Id { get; set; }
public string Name { get; set; }
}
}
Funziona bene ma viene selezionata l'intera riga ... Volevo mantenere le celle selezionate a caso nel DGV; –
Esempio di codice aggiornato per illustrare la selezione della cella. –
Nota, ti servirà una sorta di campo ID per abbinare accuratamente le vecchie righe alle nuove righe. Speriamo che l'esempio lo renda abbastanza chiaro. –
- 1. Mantenere un DataGridView autosortato
- 2. Come mantenere le selezioni evidenziate in un Listbox tkinter?
- 3. DataGridView: Modifica Modifica Dimensione controllo durante la modifica
- 4. Come mantenere i dati dei frammenti dopo le transazioni backstack?
- 5. Modifica dinamica colore cella datagridview
- 6. Mantenere i dati SQLite dopo l'aggiornamento
- 7. DataGridView Modifica nomi colonna
- 8. Rimandare aggiornamento DataGridView durante la modifica del DataTable sottostante
- 9. Emacs: mantenere la regione selezionata dopo l'operazione
- 10. C# - come faccio rinfresco DataGridView dopo aver rimosso le righe
- 11. Come mantenere le intestazioni delle colonne del frame di dati dopo Pre-processing in scikit-learn
- 12. Come salvare posizione dopo ricarica DataGridView
- 13. Qual è la differenza tra tutte le selezioni della selezione?
- 14. Modifica risultati odata dopo la query
- 15. DataGridView - "Stile di selezione cella" - Modifica cella
- 16. ComboBox in DatagridView in modalità di modifica
- 17. DataGridView genera automaticamente le colonne
- 18. L'utente non può ridimensionare le colonne DataGridView
- 19. Citazione perdersi dopo la modifica un elemento
- 20. Come evidenziare le selezioni multiple? Per esempio
- 21. Come mantenere il rendering delle cellule JTable dopo modifica delle cellule
- 22. Come rendere UIPopoverController mantenere la stessa posizione dopo la rotazione?
- 23. Lettura dei dati da DataGridView in C#
- 24. AppStore: modifica dell'icona dopo la pubblicazione dell'app?
- 25. C# righe di ordine dati datagridview?
- 26. Colonna ComboBox DataGridView: modifica il valore della cella dopo aver effettuato la selezione dal menu a discesa?
- 27. ProtectedData.Unprotect (DPAPI) smette di funzionare dopo la modifica della password
- 28. Mantenere l'ordine nei dati D3
- 29. Come mantenere la sessione utente dopo l'uscita dall'app in Firebase
- 30. Come formattare le colonne DateTime in DataGridView?
Ha funzionato Y_Y? Se sì, potresti contrassegnare la risposta come risposta per favore? –