2009-12-31 41 views

cevap

5

Gereksinimlerinize özel ölçütler temelinde neyin seçilmesi gerektiği ile eşleşebilir ve eşleştirmeye bağlı olarak hücre veya satırın Select özelliği özelliğini true/false olarak ayarlayabilirsiniz. İşte, basit bir örnek olarak, noktayı gösterecek yeni oluşturulan bir winforms projesine girebilirsiniz. Çalışmak için bu örnek için DataGridView's SelectionMode = FullRowSelect ayarladığınızdan emin olun. Hücre seçimlerini korumak/yeniden uygulamak isterseniz, yaklaşım benzer olacaktır. Not: Ayrıca, seçilen satır indekslerinin bir listesini de tutabilirsiniz, ancak bu, genellikle başka bir veri kaynağını yüklerken, gerçek satırlar ve verilerdeki fiziksel konumları arasında herhangi bir yazışma olacağı olasılığından dolayı genellikle mantıklı olmaz.

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

} 

Seçilen hücreler için aynı işlevi uygulamak için aşağıdaki gibi bir şey yapın. Kimsenin buna ihtiyacı varsa önceki kodu terk ediyorum. Not: Burada sadece anonim bir yazıyorum, muhtemelen üye alanlarına, özelliklerine vb. Bağlı olarak biraz daha karmaşık bir şeyler yapmanız gerekecek, ancak seçilen hücrelerin ayarlanmasının genel prensibi doğru şekilde gösterilip umarım anlamak için kolayca test edilir ve hata ayıklanır.

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

İyi çalışır, ancak tüm sıra seçildi ... DGV'de rastgele seçilen hücreleri tutmak istedim; –

+0

Hücre seçimini göstermek için kod örneği güncellendi. –

+0

Lütfen unutmayın, eski satırları yeni satırlarla eşleştirmek için bir çeşit kimlik alanına ihtiyacınız olacak. Umarım örnek bunu oldukça açık hale getirir. –

İlgili konular