2009-12-31 8 views

risposta

5

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

} 
+0

Funziona bene ma viene selezionata l'intera riga ... Volevo mantenere le celle selezionate a caso nel DGV; –

+0

Esempio di codice aggiornato per illustrare la selezione della cella. –

+0

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

Problemi correlati