2013-11-27 4 views
5

में बाध्यकारी मैं प्रोग्रामिंग के DataGrid बना रहा हूं और ComboBoxColumns का भी समर्थन करना चाहता हूं।डेटाग्रिडबॉन्क्सकॉलम को डेटाग्रिड के आइटमसोर्स में सी #

DataGrid बनाने के बाद, मैंने को BindableList<BindableDictionary> के संग्रह के संग्रह में सेट किया है। BindableDictionary एक कस्टम प्रकार है। प्रत्येक BindableDictionary एक टुपल का प्रतिनिधित्व करता है। यह कुंजी हमेशा कॉलम का नाम है और इसका मान एक कस्टम क्लास है जिसमें ActualValue नामक एक सामान्य संपत्ति होती है, Dictionary<T, string>AllowedValues और boolean कहा जाता है जो निर्धारित करता है कि का उपयोग ComboBoxColumn या 'सामान्य' कॉलम बनाने के लिए किया जाएगा। यह वर्ग INotifyPropertyChanged और INotifyPropertyChanging लागू करता है।

वह सामान काम करता है, कॉम्बोबॉक्स कॉलम, डुह से अलग करता है। ComboBoxColumn के साथ मेरी समस्या मैं यह कैसे AllowedValues वस्तु का उपयोग करने के लिए यह ItemList है और सही ValueAllowedValuesBindableDictionary से चयन करने के लिए पाठ क्षेत्र को भरने के लिए ActualValue संपत्ति का उपयोग भरने के लिए प्राप्त करने के लिए पता नहीं है कि है।

table.Columns.Add(new DataGridTextColumn() { Header = column.GUIName, DisplayIndex = column.Position, Binding = new Binding(column.Name + ".ActualValue") { UpdateSourceTrigger = UpdateSourceTrigger.Default, Mode = BindingMode.TwoWay, NotifyOnTargetUpdated = true, NotifyOnSourceUpdated = true, UpdateSourceExceptionFilter = new UpdateSourceExceptionFilterCallback(BindingExceptionHandler) } }); 

और हाँ, कि काम करता है:

उदाहरण के लिए, यह कैसे मैं एक textbased स्तंभ के लिए बाध्य है।

मैं column.AllowedValues को DataGridComboBoxColumn की ItemsSource गुण सेट और DisplayPath"Value" है जो कम से कम सही सामग्री को प्रदर्शित करने के लिए सेट करने की कोशिश की, लेकिन मैं कोई सुराग नहीं कैसे ActualValue संपत्ति है कि DataGrid में निहित है करने के लिए बाध्य करने के लिए है ItemsSource है। इसके अलावा इसका मतलब यह होगा कि कॉलम के अंदर सभी कोशिकाएं एक ही चयन योग्य मान साझा करती हैं, जो भविष्य में समस्याओं का कारण बन सकती है।

और यदि मैं DataGridTextColumn में किए गए सबकुछ को बांधने का प्रयास करता हूं, तो कुछ भी प्रदर्शित नहीं होता है। इसके अलावा चयन करने के लिए कोई आइटम नहीं हैं।

यह बहुत ही अच्छा होगा अगर किसी के पास इस बात का संकेत हो कि मैं कोशिश कर सकता हूं।

संपादित

बस इस देखा: https://stackoverflow.com/a/2197004/937093, मुझे लगता है कि कोशिश की, लेकिन तब मैं मेरी उत्पादन विंडो में निम्न संदेश:

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=AllowedValues; DataItem=null; target element is 'DataGridComboBoxColumn' (HashCode=33493530); target property is 'ItemsSource' (type 'IEnumerable')

मेरे कोड इस तरह दिखता है:

col = new DataGridComboBoxColumn() { Header = column.GUIName, SelectedValueBinding = new Binding(column.Name + ".ActualValue"), SelectedValuePath = "ActualValue" }; 
table.Columns.Add(col); 
BindingOperations.SetBinding(col, DataGridComboBoxColumn.ItemsSourceProperty, new Binding("AllowedValues")); 

संपादित 2 ठीक है, यह पाया वेबसाइट: http://www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/

मैं प्रॉक्सी बंधन सामान लागू करने के लिए (भले ही मैं कैसे कॉलम डेटा ग्रिड ... और कहाँ यह होगा ?! के दृश्य पेड़ के हिस्सा नहीं है नहीं मिलता है) की कोशिश की लेकिन यह काम नहीं करेगा।मेरे कोड:

BindingProxy proxy = new BindingProxy() { Data = table.ItemsSource }; 
table.Resources.Add("proxy", proxy }); 
col = new DataGridComboBoxColumn() { Header = column.GUIName, SelectedValueBinding = new Binding("Data." + column.Name + ".ActualValue") { Source = proxy }, DisplayMemberPath = "Value", SelectedValuePath = "Key" }; 
table.Columns.Add(col); 
BindingOperations.SetBinding(col, DataGridComboBoxColumn.ItemsSourceProperty, new Binding("Data." + column.Name + ".AllowedValues") }); 

उत्पादन विंडो में आउटपुट:

System.Windows.Data Error: 40 : BindingExpression path error: 'MyColumn' property not found on 'object' ''BindingList`1' (HashCode=55207835)'. BindingExpression:Path=Data.MyColumn.ActualValue; DataItem='BindingProxy' (HashCode=45660050); target element is 'TextBlockComboBox' (Name=''); target property is 'SelectedValue' (type 'Object')

मैं समस्या को समझने (यह BindingList में 'MyColumn' वस्तु खोजने की कोशिश कर रहा है), लेकिन मुझे समझ नहीं आता क्यों कि क्या हो रहा है (इसे बाध्यकारी सूची [iterator] ["MyColumn"] को हल करना चाहिए, क्योंकि बाइंडिंगलिस्ट में बाइंडेबल डिक्शनरी है और यह मेरे 'सामान्य' कॉलम के लिए बिल्कुल होता है)।

उत्तर

0

मैंने कुछ ऐसा ही किया। मैं विनफॉर्म का उपयोग कर रहा था, इसलिए मेरा समाधान आपके लिए काम नहीं कर सकता है। हालांकि मैं इस तरह के कुछ का उपयोग करने का सुझाव देना चाहूंगा।

http://tech.pro/tutorial/776/csharp-tutorial-binding-a-datagridview-to-a-collection

इस सबके अलावा।

http://www.codeproject.com/Articles/31418/Implementing-a-Sortable-BindingList-Very-Very-Quic

मैं काम कर सब कुछ था, तो पाया कि मैं अपने DataGridView सॉर्ट नहीं कर सका।

मेरे पास मेरा स्रोत कोड आसान नहीं है, लेकिन सामान्य विचार था कि मैं अपने comboboxes और टेक्स्टबॉक्स कॉलम हाथ से बनाऊंगा, फिर मेरी सूची को बाध्य करें।

बाद में मैं एक समारोह चलाता हूं जो प्रत्येक पंक्ति के माध्यम से पुन: उत्पन्न होता है और इंडेक्स पर आधारित होता है (मेरे मामले में मेरे comboboxes पिछले 3 कॉलम थे) मैं पहले combobox के लिए मान जोड़ना होगा, उसके बाद वे जोड़े गए हैं, मैं combobox के मूल्य की जांच करूँगा और इसे उस पर सेट करूँगा।

मैंने इस त्रुटि को डेटा त्रुटि ईवेंट में भी शामिल किया, जब मैंने एक नया कॉलम जोड़ा। अगर मैं एक नई पंक्ति जोड़ रहा था, तो यह यादृच्छिक रूप से दुर्घटनाग्रस्त हो जाएगा, अगर मेरे पास ऑटोोज़ाइज सेट था। मुझे इसे डिफ़ॉल्ट रूप से सेट करना था, मेरा संपादन करें, फिर इसे रीसेट करें।

इच्छा है कि मुझे प्रदान करने के लिए कोड था, लेकिन यह आपको अपने रास्ते पर रख सकता है। यदि कल मैं काम पर नहीं जाता तो मैं कुछ पोस्ट करूंगा। Comboboxes के साथ काम करने के लिए एक बड़ा दर्द है।

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