2010-10-25 12 views
12

मैं उन अनुप्रयोगों में से एक में डब्ल्यूपीएफ टूलकिट डाटाग्रिड का उपयोग कर रहा हूं, जिन पर मैं काम कर रहा हूं। मैं चाहता हूं कि कॉलम चौड़ाई और डिस्प्लेइन्डेक्स को उपयोगकर्ता वरीयता के रूप में स्टोर करना है। मैंने इसे कॉलम डिस्प्लेन्डेक्स के लिए प्राप्त किया है लेकिन आकार बदलने के लिए मुझे डेटाग्रिड पर कोई भी ईवेंट नहीं मिला जो स्तंभ आकार परिवर्तन के बाद ट्रिगर होगा। मैंने "साइज चेंजेड" ईवेंट की कोशिश की है जो मुझे लगता है कि जब यह प्रारंभ में आकार की गणना कर रहा है तो वह केवल निकाल दिया जाता है और यह भी पूरे डेटाग्रिड के लिए है, न कि व्यक्तिगत कॉलम के लिए।
कोई वैकल्पिक समाधान या यदि कोई घटना के बारे में जानता है?डब्ल्यूपीएफ टूलकिट डेटाग्रिड कॉलम का आकार बदलें

उत्तर

-1

आप DataGrid को विस्तारित करने और फिर NotifyPropertyChange ईवेंट को लागू करने का प्रयास कर सकते हैं। कुछ इस तरह:

class MyDataGrid : DataGrid, INotifyPropertyChanged 
{ 
    private DataGridLength _columnWidth; 
    public DataGridLength ColumnWidth 
    { 
     get { return _columnWidth; } 
     set 
     { 
      _columnWidth = value; 
      NotifyPropertyChanged("ColumnWidth"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(String propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

वहाँ से, आप हैंडलर के लिए एक delagate जोड़ने जो कुछ भी आप यह करना चाहते हैं कर सकते हैं। की तरह कुछ:

MyDataGrid dataGrid; 
//init grid, do stuff 

dataGrid.PropertyChanged += new PropertyChangedEventHandler(ColumnWidthChanged); 
//ColumnWidthChanged will be a method you define 

अब आप delagate है तो आप उसे आप क्या चाहते हो जब स्तंभ चौड़ाई परिवर्तित हो जाता है परिभाषित कर सकते हैं:

private void ColumnWidthChanged(object sender, PropertyChangedEventArgs args) 
{ 
    if(args.PropertyName.Equals("ColumnWidth")) 
    { 
     //Do stuff now that the width is changed 
    } 
} 

आपको लगता है कि मैं जो के लिए जाँच कर रहा हूँ पर ध्यान देंगे संपत्ति बदल दी गई थी। जिस तरह से मैंने इसे स्थापित किया है, ऐसा है कि आप अन्य गुणों का विस्तार कर सकते हैं और हैंडलर को भी उनके बदलाव के लिए बना सकते हैं। यदि आप एक हैंडलर को और अधिक चाहते हैं, तो शायद DataGridPropertyChanged विधि बनाने के लिए सबसे अच्छा होगा जो उस संपत्ति पर स्विच करता है जिस पर संपत्ति बदल दी गई थी। इसके बाद यह बदली जाने वाली प्रत्येक संपत्ति के लिए उपयुक्त विधि (जैसे ColumnWidthChanged) को कॉल करेगा। इस तरह, आपको यह जांचना नहीं होगा कि प्रत्येक हैंडलर केवल एक संपत्ति को संशोधित करता है।

आपने कोई भाषा निर्दिष्ट नहीं की है, इसलिए मैंने इसे सी # पर फिर से टैग किया। हालांकि, अगर आप इसका उपयोग कर रहे हैं तो वीबी को स्थानांतरित करने के लिए यह काफी सरल होना चाहिए।

आशा है कि इससे मदद मिलती है!

+0

यह वास्तव में मदद नहीं करता है क्योंकि आप केवल एक ही स्तंभ चौड़ाई मिल गया है और यदि स्तंभ कोड में आकार दिया गया था आपके घटना केवल उठाया जाएगा, कुछ तुम जाल वैसे भी कर सकते थे। – MikeKulls

0

मुझे लगता है कि आप कॉलम चौड़ाई को सहेजना चाहते हैं ताकि अगली बार एप्लिकेशन शुरू हो जाए, उसी कॉलम चौड़ाई का उपयोग डेटा ग्रिड उत्पन्न करने के लिए किया जाता है।

यदि ऐसा है तो आवेदन बंद होने पर कॉलम चौड़ाई (और इंडेक्स) को सहेजना एक विकल्प है, जो कॉलम का आकार बदलने पर चौड़ाई को बचाने से भी अधिक कुशल होगा।

कैसे अपने आवेदन संरचित है के आधार पर, कुछ इस तरह काम करना चाहिए ...

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
{ 
    foreach (DataGridColumn column in dataGrid1.Columns) 
    { 
    // save the column.Width property to a user setting/file/registry/etc... 
    // optionally save the displayindex as well... 
    } 
} 
+0

हाय, क्या आप कृपया मुझे कुछ संकेत दे सकते हैं कि मूल्य को C# से xaml में कैसे कॉपी करें? मैंने यह कोशिश की है: शब्दकोश list = new Dictionary (); foreach (DataGridView.Columns में DataGridColumn कॉलम) { DataGridLength x = column.Width; सूची। जोड़ें (कॉलम। हैडर। टॉस्ट्रिंग(), एक्स); } – user1850936

9

से ... लिया:

PropertyDescriptor pd = DependencyPropertyDescriptor 
          .FromProperty(DataGridColumn.ActualWidthProperty, 
              typeof(DataGridColumn)); 

     foreach (DataGridColumn column in Columns) { 
       //Add a listener for this column's width 
       pd.AddValueChanged(column, 
            new EventHandler(ColumnWidthPropertyChanged)); 
     } 
:

http://forums.silverlight.net/post/602788.aspx

लोड के बाद

2 विधियां:

private bool _columnWidthChanging; 
    private void ColumnWidthPropertyChanged(object sender, EventArgs e) 
    { 
     // listen for when the mouse is released 
     _columnWidthChanging = true; 
     if (sender != null) 
      Mouse.AddPreviewMouseUpHandler(this, BaseDataGrid_MouseLeftButtonUp); 
    } 

    void BaseDataGrid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     if (_columnWidthChanging) { 
      _columnWidthChanging = false; 
      // save settings, etc 

     } 
    } 

कॉलमविड्थप्रोपर्टी लगातार चलती है जबकि उपयोगकर्ता चौड़ाई को ड्रैग करता है। PreviewMouseUp हैंडलर जोड़ना आपको उपयोगकर्ता द्वारा किए जाने पर संसाधित करने देता है।

+0

यदि हम डबल क्लिक का उपयोग करते हैं तो यह काम नहीं करता है। डबल क्लिक करें "ऑटो" कॉलम चौड़ाई। – Rover

+1

@ रोवर ... लेकिन डबल क्लिक को पकड़ने के लिए एक आसान घटना है। मुझे नहीं पता कि समस्या क्या है। –

+0

एक समस्या यह है कि आप कई ईवेंटशंडर – stefan

1

लेआउट अपडेट किया गया?

मैं सिल्वरलाइट में काम कर रहा हूं, और ग्रिड हर सेकेंड को रिबाउंड/रीफ्रेश किया जाता है।

मैं लेआउट अपडेटेड विधि का उपयोग कर रहा हूं, जो हर लेआउट अद्यतन करने की घटना के लिए आग लगती है।

आप कॉलम चौड़ाई का शब्दकोश रख सकते हैं और डेल्टा की जांच कर सकते हैं। फिर आप जान लेंगे कि कौन सा कॉलम बदल गया था।

foreach (DataGridColumn column in dataGrid1.Columns) 
{ 
    // check for changes... 
    // save the column.Width property to a dictionary... 
} 
संबंधित मुद्दे