2009-12-31 13 views

Antwort

5

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; } 
    } 

} 
+0

Gut funktioniert, aber die ganze Reihe wird ausgewählt ... Ich wollte zufällig ausgewählte Zellen im DGV behalten; –

+0

Codebeispiel aktualisiert, um die Zellenauswahl zu veranschaulichen. –

+0

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. –

Verwandte Themen