Czy istnieje sposób na zachowanie wybranych komórek w DataGridView wybranych po zmianie źródła DataSource?DataGridView: Zachowaj wybór po zmianie źródła danych?
Odpowiedz
Możesz dopasować to, co powinno być wybrane w oparciu o kryteria specyficzne dla Twoich potrzeb i po prostu ustaw właściwość Wybierz komórki lub wiersza na wartość true/false w zależności od dopasowania. Oto prosty przykład, w którym można umieścić nowo utworzony projekt WinForm, który zilustruje ten punkt. Aby ten przykład działał, upewnij się, że ustawiłeś SelectionMode DataGridView = FullRowSelect. Jeśli chcesz zachować/ponownie zastosować selekcje komórek, podejście będzie podobne. Uwaga: możesz również zachować listę wybranych indeksów wierszy, ale zazwyczaj nie ma to sensu, gdy ładujesz inne źródło danych, ponieważ zwykle nie jest prawdopodobne, aby istniała jakaś zgodność między rzeczywistymi wierszami a ich fizyczną pozycją w danych.
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; }
}
}
Aby zaimplementować tę samą funkcjonalność dla wybranych komórek, wykonaj następujące czynności. Opuszczam poprzedni kod, jeśli ktoś go potrzebuje. Uwaga: Właśnie wybieram tutaj typ anonimowy, prawdopodobnie będziesz musiał zrobić coś bardziej wyrafinowanego w zależności od pól elementów, właściwości itp., Ale ogólna zasada ustawienia zaznaczonych komórek jest odpowiednio zilustrowana i może łatwo mam być przetestowany i debugowany dla zrozumienia Mam nadzieję.
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; }
}
}
Dobrze działa, ale cały wiersz zostaje wybrany ... Chciałem zachować losowo wybrane komórki w DGV; –
Próbka kodu zaktualizowana w celu zilustrowania wyboru komórki. –
Pamiętaj, że będziesz potrzebować jakiegoś pola identyfikacyjnego, aby dokładnie dopasować stare wiersze do nowych wierszy. Mam nadzieję, że przykład czyni to dość jasnym. –
- 1. Dynamicznie przeładuj UIPageViewController po zmianie źródła danych
- 2. Zachowaj zawartość bazy danych przy zmianie modelu
- 3. CollectionViewSource Filtr nie odświeżony po zmianie źródła
- 4. DataGridView Zapisz zmiany w zmianie wiersza
- 5. DataGridView nie przyjmuje źródła danych po wywołaniu za pomocą testu jednostkowego
- 6. DataGridViewCheckBoxColumn: sposób aktualizacji powiązanego źródła danych o zmianie właściwości zamiast sprawdzania poprawności
- 7. Połączenia a źródła danych
- 8. DataGridView Filtrowanie źródła BindingSource z listą obiektów jako DataSource
- 9. Zachowaj typ danych kolumny Dataframe po zewnętrznym scaleniu
- 10. Animacja po zmianie układu
- 11. Zachowaj MemoryMappedFile Alive po usunięciu
- 12. Nie można zmienić koloru komórki datagridview podczas korzystania ze źródła danych
- 13. Komórka nagłówka wiersza danych DataGridView
- 14. NamedParameterJdbcDaoSupport autowire źródła danych?
- 15. Utwórz własne źródła danych
- 16. Zachowaj ustawienia w bazie danych
- 17. Zachowaj stan miękkiego wejścia/IME w zmianie orientacji
- 18. Prawidłowy sposób na odłączenie źródła BindingSource od DataGridView
- 19. AngularJs nie aktualizuje modelu po zmianie danych wejściowych
- 20. Zestaw danych SSRS nie odświeżono po zmianie procedury przechowywanej MySQL
- 21. Sposób aktualizacji interfejsu użytkownika po zmianie bazy danych
- 22. Flex 3.5.0; Aktualizacja listy wyświetlania ComboBox po zmianie dostawcy danych
- 23. React Native ListView nie aktualizuje po zmianie danych
- 24. Błąd: zduplikowane symbole architektury armv7 po zmianie Model danych podstawowych
- 25. Użyj wp_query po zmianie bazy danych za pomocą nowego wpdb
- 26. Jak zaktualizować QAbstractTableModel i QTableView po posortowaniu źródła danych?
- 27. Animuj elementy listview po ich dodaniu/usunięciu ze źródła danych
- 28. Jak zapisać pozycję po reload DataGridView
- 29. JasperReporty i niestandardowe źródła danych
- 30. Czytanie danych z DataGridView w C#
Czy to była praca Y_Y? Jeśli tak, czy mógłbyś oznaczyć odpowiedź jako odpowiedź? –