2009-12-31 10 views
5

क्या डेटा स्रोत बदलने के बाद चयनित डेटाग्रिड व्यू के चयनित कक्षों को रखने का कोई तरीका है?डेटाग्रिड व्यू: डेटास्रोत बदलने के बाद चयन रखें?

+0

क्या यह काम Y_Y था? यदि हां, तो क्या आप उत्तर को उत्तर के रूप में चिह्नित कर सकते हैं? –

उत्तर

5

आप मिलान कर सकते हैं कि आपकी आवश्यकताओं के अनुरूप मानदंडों के आधार पर क्या चुना जाना चाहिए और बस अपने मिलान के आधार पर सेल या पंक्ति के गुण को सही/गलत पर सेट करें। यहां एक साधारण उदाहरण दिया गया है जिसे आप नव निर्मित विनफॉर्म प्रोजेक्ट में छोड़ सकते हैं जो बिंदु को चित्रित करेगा। इस उदाहरण के लिए काम करने के लिए सुनिश्चित करें कि आपने DataGridView के SelectionMode = FullRowSelect को सेट किया है। यदि आप सेल चयन को बनाए रखना/पुनः लागू करना चाहते हैं तो दृष्टिकोण समान होगा। नोट: आप केवल चयनित पंक्ति इंडेक्स की एक सूची भी बरकरार रख सकते हैं, लेकिन आमतौर पर यह कोई अन्य डेटा स्रोत लोड करते समय समझ में नहीं आता है क्योंकि यह आम तौर पर अनजाने में होता है कि डेटा में वास्तविक पंक्तियों और उनकी भौतिक स्थिति के बीच कोई पत्राचार होगा।

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

} 

चयनित कोशिकाओं के लिए समान कार्यक्षमता को लागू करने के लिए निम्न की तरह कुछ करें। मैं पिछले कोड को छोड़ रहा हूं किसी और को इसकी आवश्यकता है। नोट: मैं बस यहां एक अनाम प्रकार को टक्कर दे रहा हूं, आपको शायद सदस्य फ़ील्ड, गुण इत्यादि के आधार पर कुछ और परिष्कृत करने की आवश्यकता होगी, लेकिन चयनित कक्षों को स्थापित करने के सामान्य प्रिंसिपल को सही ढंग से चित्रित किया जा सकता है और कर सकते हैं मुझे उम्मीद है कि आसानी से परीक्षण और डीबग किया जा सकता है।

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

अच्छी तरह से काम करता है लेकिन पूरी पंक्ति चयनित हो जाती है ... मैं डीजीवी में यादृच्छिक रूप से चयनित कोशिकाओं को रखना चाहता था; –

+0

सेल नमूना सेल चयन को चित्रित करने के लिए अद्यतन किया गया। –

+0

कृपया ध्यान दें, आपको पुरानी पंक्तियों को नई पंक्तियों से सटीक रूप से मिलान करने के लिए किसी प्रकार का आईडी फ़ील्ड चाहिए। उम्मीद है कि उदाहरण काफी स्पष्ट करता है। –

संबंधित मुद्दे