2013-01-24 46 views
8

मुझे DataGridView मिला है जिसे SortableBindingListas described by this article द्वारा समर्थित किया गया है।डेटाग्रिड व्यू को ऑटोसॉर्ट किया गया

यह अनिवार्य रूप से BindingList है जिसका डेटा स्रोत कस्टम ऑब्जेक्ट्स की एक सूची है। अंतर्निहित कस्टम ऑब्जेक्ट्स प्रोग्रामेटिक रूप से अपडेट किए जाते हैं।

मेरा SortableBindingList मुझे प्रत्येक कॉलम को आरोही या अवरोही क्रम में क्रमबद्ध करने की अनुमति देता है। मैं ApplySortCore विधि

protected override void ApplySortCore(PropertyDescriptor prop, 
             ListSortDirection direction) 

यह जब स्तंभ शीर्ष पर क्लिक किया जाता है छँटाई के लिए अच्छी तरह से काम करता है लेकिन नहीं तरह स्वचालित रूप से उस कॉलम में सेल प्रोग्राम के अद्यतन किया जाता है जाएगा अधिक भार से यह कर दिया है।

क्या कोई अन्य DataGridView को अपने अंतर्निहित डेटा स्रोत के प्रोग्रामेटिक अपडेट से क्रमबद्ध करने के लिए एक अच्छा समाधान के साथ आया है?

उत्तर

1

ओवरराइड करने के लिए इस वर्ग पर विचार करें:

public class MyClass : INotifyPropertyChanged 
{ 
    private int _id; 
    private string _value; 

    public int Id 
    { 
     get 
     { 
      return _id; 
     } 
     set 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs("Id")); 
      _id = value; 
     } 
    } 
    public string Value 
    { 
     get 
     { 
      return _value; 
     } 
     set 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs("Value")); 
      _value = value; 
     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged = new PropertyChangedEventHandler(OnPropertyChanged); 

    private static void OnPropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     // optional code logic 
    } 
} 

अपने sortable बंधन सूची में इन तरीकों जोड़ें:

public class SortableBindingList<T> : BindingList<T>, INotifyPropertyChanged 
    where T : class 
{ 
    public void Add(INotifyPropertyChanged item) 
    { 
     item.PropertyChanged += item_PropertyChanged; 
     base.Add((T)item); 
    } 

    void item_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     this.PropertyChanged(sender, new PropertyChangedEventArgs(String.Format("{0}:{1}", sender, e))); 
    } 

    // other content in the method body 
} 

और में इस नमूने तरीकों का उपयोग अपने फॉर्म:

public Form1() 
{ 
    InitializeComponent(); 
    source = new SortableBindingList<MyClass>(); 
    source.Add(new MyClass() { Id = 1, Value = "one test" }); 
    source.Add(new MyClass() { Id = 2, Value = "second test" }); 
    source.Add(new MyClass() { Id = 3, Value = "another test" }); 
    source.PropertyChanged += source_PropertyChanged; 
    dataGridView1.DataSource = source; 

} 

void source_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    MessageBox.Show(e.PropertyName); 
    dataGridView1.DataSource = source; 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    ((MyClass)source[0]).Id++; 
} 
+1

में सभी प्रोग्रामेटिक परिवर्तनों पर मुझे सूचित करने के लिए काम नहीं करता धन्यवाद, यह काम करता है। मैं मदद की सराहना करता हूं! – chollida

4

कोशिश OnDataSourceChanged घटना

public class MyGrid : DataGridView { 
    protected override void OnDataSourceChanged(EventArgs e) 
    { 
     base.OnDataSourceChanged(e); 
     MyComparer YourComparer = null; 
     this.Sort(YourComparer); 
    } 
} 
+0

सहायता के लिए धन्यवाद। मैंने यह कोशिश की थी लेकिन यह अंतर्निहित डेटासोर्स – chollida