Gibt es eine Möglichkeit, die ausgewählten Zellen eines DataGridView ausgewählt zu lassen, nachdem die DataSource geändert wurde?DataGridView: Selektionen beibehalten, nachdem die Datenquelle geändert wurde?
Antwort
Sie können auswählen, was basierend auf Kriterien ausgewählt werden soll, die Ihren Anforderungen entsprechen, und die Select-Eigenschaft der Zelle oder Zeile je nach Übereinstimmung auf true/false setzen. Hier ist ein einfaches Beispiel, das Sie in ein neu erstelltes winforms-Projekt einfügen können, das den Punkt veranschaulicht. Damit dieses Beispiel funktioniert, stellen Sie sicher, dass Sie den SelectionMode = FullRowSelect der DataGridView gesetzt haben. Wenn Sie die Zellenauswahl beibehalten/erneut anwenden möchten, ist die Vorgehensweise ähnlich. Hinweis: Sie können auch eine Liste ausgewählter Zeilenindizes beibehalten. Dies ist jedoch normalerweise beim Laden einer anderen Datenquelle nicht sinnvoll, da normalerweise keine Übereinstimmung zwischen den tatsächlichen Zeilen und ihrer physischen Position in den Daten besteht.
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; }
}
}
Um die gleiche Funktionalität für ausgewählte Zellen zu implementieren, tun Sie etwas wie folgt. Ich verlasse den vorherigen Code, sollte es jemand anderes brauchen. Hinweis: Ich schreibe hier einfach einen anonymen Typ, Sie werden wahrscheinlich etwas komplizierteres tun müssen, abhängig von Elementfeldern, Eigenschaften usw. Aber das allgemeine Prinzip der Einstellung der ausgewählten Zellen wird richtig dargestellt und kann leicht getestet und debugged für das Verständnis hoffe ich.
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; }
}
}
Gut funktioniert, aber die ganze Reihe wird ausgewählt ... Ich wollte zufällig ausgewählte Zellen im DGV behalten; –
Codebeispiel aktualisiert, um die Zellenauswahl zu veranschaulichen. –
Bitte beachten Sie, dass Sie eine Art ID-Feld benötigen, um alte Zeilen genau mit neuen Zeilen abzugleichen. Hoffentlich macht das Beispiel das ziemlich klar. –
- 1. C++ - Speicher beibehalten, nachdem App geschlossen wurde
- 2. JQuery - Aktion ausführen, nachdem Hintergrundposition geändert wurde
- 3. DataGridView-Combobox-Spalte mit Datenquelle
- 4. setNeedsLayout oder layoutIfNeeded erforderlich, nachdem die Constraint-Konstante geändert wurde?
- 5. Mitgliedschaft Benutzer wurde nicht gefunden, nachdem UserName geändert wurde
- 6. JQuery $ (this) nicht erkannt, nachdem HTML geändert wurde
- 7. Android - Etwas tun * nachdem * Text in EditText geändert wurde
- 8. Yii-Sitzungen funktionieren nicht mehr, nachdem der Datenbankserver geändert wurde
- 9. Deaktivierte Textbox funktioniert nicht, nachdem "Design" geändert wurde
- 10. warum instanceof immer wahr sagt, nachdem der Prototyp geändert wurde?
- 11. Zeitgeberaufträge werden nicht ausgeführt, nachdem der Zeitplan geändert wurde
- 12. Suchen von Elementen, nachdem das DOM geändert wurde
- 13. Zurück zu derselben Aktivität, nachdem sie auf Android geändert wurde
- 14. Aufruf eines Makros 2 Sek. Nachdem eine Zelle geändert wurde
- 15. DataGridView Mehrere Zeilen bei Linksklick beibehalten
- 16. Wie kann ich die Fokusposition in UpdatePanel beibehalten, nachdem die Seite teilweise zurückgestellt wurde
- 17. Die Orientierung der Elternansicht beibehalten, nachdem die Modalansicht mit anderer Ausrichtung dargestellt wurde
- 18. Binden eines SortedList als Datenquelle meiner Datagridview
- 19. Datenaktualisierungen, die nicht bestehen, nachdem eine WPF-Anwendung geschlossen wurde
- 20. DataGridview Zelle Farbe kann nicht geändert werden, wenn Sie eine Datenquelle verwenden
- 21. Aktualisiert die mittlere Position einer UIView, nachdem die Ausrichtung geändert wurde iOS8
- 22. Wie wird das Bildschirm-Overlay geändert, nachdem der System-Ui-Modus geändert wurde (Vollbild, Navigation ausblenden)?
- 23. Ausgewählte Parameter löschen, nachdem GridView gerendert wurde
- 24. Wie wird die Position anderer Ansichten beibehalten, nachdem eine Ansicht aus der ViewGroup entfernt wurde?
- 25. Wert einer Variablen beibehalten, nachdem die Anwendung geschlossen und wieder geöffnet wurde
- 26. Combobox datagridview Auswahl geändert Populationswert in datagridview andere Zelle
- 27. Flex Spark DropDownList selectedItem wurde nicht aktualisiert, nachdem der DataProvider geändert wurde
- 28. Wurde die Control.Monad.State-API kürzlich geändert?
- 29. Was passiert, nachdem die Nachrüstungsanforderung abgeschlossen wurde?
- 30. C# -Aufnahmemethode, nachdem die Browsersteuerung beendet wurde?
Hat das funktioniert Y_Y? Wenn ja, kannst du die Antwort als beantwortet markieren? –