2013-03-12 6 views
7

असल में मैंने डेटाग्रिड को बाध्य किया है ताकि यह विषयों के समय सारिणी जैसा दिखता हो - प्रत्येक पंक्ति विषयों के सेमेस्टर का प्रतिनिधित्व करती है, और उस सेमेस्टर के भीतर प्रत्येक सेल एक विषय का प्रतिनिधित्व करता है।कोड में डेटाग्रिडसेल की डेटा ऑब्जेक्ट को मैं कैसे एक्सेस कर सकता हूं?

अब मैं ड्रैग और ड्रॉप कार्यक्षमता जोड़ने की कोशिश कर रहा हूं ताकि आप अतिरिक्त विषयों को ग्रिड पर खींच सकें, और यह अंतर्निहित डेटास्ट्रक्चर को अपडेट करेगा।

मैं डेटाग्रिडसेल को खोजने के लिए कुछ विज़ुअल ट्री विधियों का उपयोग कर सकता हूं कि उपयोगकर्ता नए विषय को खींच रहा है, लेकिन मुझे नहीं पता कि सेल (विषय) को कैसे एक्सेस किया जाए ताकि सेल इसके लिए बाध्य हो नए विषय के साथ खाली/प्लेसहोल्डर मूल्य को प्रतिस्थापित करें। क्या अंतर्निहित मूल्य तक पहुंचने का कोई तरीका है या क्या मुझे इस कार्यक्रम को बनाने की पूरी विधि को पुन: व्यवस्थित करना चाहिए?

An example of the grid and the subjects to be dragged onto it

+0

क्या आप ग्रिड की संरचना पेस्ट कर सकते हैं? – Freelancer

+0

भौतिक ग्रिड व्यू या अंतर्निहित संरचना? – Miguel

+0

बस कॉलम और एक्सपोल डेटा – Freelancer

उत्तर

3

DataGridCell का डेटा प्राप्त करने के लिए, आप इसे DataContext और Column संपत्ति का उपयोग कर सकते हैं। यह कैसे करें यह वास्तव में निर्भर करता है कि आपका पंक्ति डेटा क्या है, यानी आप डेटाग्रिड के ItemsSource संग्रह में क्या आइटम डालते हैं। अपने आइटम object[] सरणियों मान लिया जाये कि कर रहे हैं:

// Assuming this is an array of objects, object[],this gets you the 
// row data as you have them in the DataGrid's ItemsSource collection 
var rowData = (object[]) DataGrid.SelectedCells[0].Item; 
// This gets you the single cell object 
var celldata = rowData[DataGrid.SelectedCells[0].Column.DisplayIndex]; 

अपने पंक्ति डेटा अधिक जटिल है, तो आप एक के अनुसार विधि है जो अपने पंक्ति डेटा आइटम पर विशिष्ट मूल्य के Column संपत्ति और पंक्ति डेटा आइटम तब्दील लिखने के लिए की जरूरत है।


संपादित करें:

सेल आप अपने डेटा ड्रॉप में चयनित सेल नहीं है, एक ही विकल्प प्राप्त करना है तो DataGridRow जो DataGridCell अंतर्गत आता है, VisualTreeHelper का उपयोग कर रहे हैं:

var parent = VisualTreeHelper.GetParent(gridCell); 
while(parent != null && parent.GetType() != typeof(DataGridRow)) 
{ 
    parent = VisualTreeHelper.GetParent(parent); 
} 
var dataRow = parent; 

फिर आपके पास पंक्ति है और ऊपर के रूप में आगे बढ़ सकते हैं।


इसके अलावा, अपने प्रश्न है कि क्या आप विधि पर पुनर्विचार करना चाहिए के बारे में, मैं कस्टम WPF व्यवहार का उपयोग कर रों सुझाव है।

व्यवहारकर्ता सी # कोड से नियंत्रण की क्षमताओं को विस्तारित करने के लिए एक बहुत सीधी रास्ता प्रदान करते हैं, बल्कि एक्सएएमएल, फिर भी अपना कोड स्पष्ट और सरल रखते हैं (जो कि एमवीवीएम का पालन करने के बाद ही अच्छा नहीं है)। व्यवहार इस तरह से डिजाइन किए गए हैं कि वे पुन: प्रयोज्य हैं और आपके विशिष्ट नियंत्रण से बंधे नहीं हैं।

Here's a good introduction

अपने विशेष मामले के लिए, मैं सिर्फ तुम क्या करना है की एक विचार दे सकते हैं: अपने TextBlock नियंत्रण के लिए

लिखें एक DropBehavior (या जो भी आप अपने को नियंत्रित DataGridCells, जो हैंडल अंदर चाहते हैं ड्रॉप। मूल विचार आपके नियंत्रण से OnAttached() विधि में कोशिकाओं की evnt के कार्यों के अनुसार रजिस्टर करने के लिए है।

public class DropBehavior : Behavior<TextBlock> 
{ 
    protected override void OnAttached() 
    { 
     AssociatedObject.MouseUp += AssociatedObject_MouseUp; 
    } 

    private void AssociatedObject_MouseUp(object sender, MouseButtonEventArgs e) 
    { 
     // Handle what happens on mouse up 

     // Check requirements, has data been dragged, etc. 
     // Get underlying data, now simply as the DataContext of the AssociatedObject 
     var cellData = AssociatedObject.DataContext; 

    } 
} 

ध्यान दें कि, एकल कक्ष का डेटा इधर-उधर पार्स करने एम पंक्ति डेटा और Column संपत्ति अप्रचलित हो जाती है।

तो फिर तुम TextBlocks, जो आप अपने कोशिकाओं के अंदर डाल करने के लिए इस व्यवहार देते हैं, अपने डेटा ग्रिड के CellStyle की ContentTemplate का उपयोग कर:

<DataGrid> 
    <DataGrid.CellStyle> 
     <Style TargetType="DataGridCell"> 
      <Setter Property="ContentTemplate"> 
       <Setter.Value> 
        <DataTemplate> 
         <TextBlock Text="{Binding}"> 
          <i:Interaction.Behaviors> 
           <yourns:DropBehavior/> 
          </i:Interaction.Behaviors> 
         </TextBlock> 
        </DataTemplate> 
       </Setter.Value> 

      </Setter> 
     </Style> 
    </DataGrid.CellStyle> 
</DataGrid> 

आप

सिस्टम में Behavior<T> baseclass पा सकते हैं .Windows.Interactivity.dll

मैंने इसका परीक्षण नहीं किया है, लेकिन मुझे उम्मीद है कि आपके लिए काम करता है और आपको विचार मिलता है ...

+0

मुझे डब्ल्यूपीएफ व्यवहार की बात है, लिंक के लिए धन्यवाद। हालांकि आपके उत्तर के पहले भाग के लिए मैं आपके समाधानों में से कोई भी नहीं कर सकता। पहले उदाहरण में आप DataGrid.SelectedCells [0] का उपयोग करते हैं जो DataGridCellInfo देता है जो मेरे पास * नहीं है। याद रखें कि मेरे पास केवल डेटाग्रिडसेल है जो मुझे ड्रैग-ड्रॉप के बाद माउस स्थिति से मिला है, मेरे पास कोई चयन नहीं है। मैं इस सेल का चयन कर सकता हूं और फिर इस विधि को कर सकता हूं लेकिन मुझे उपयोगकर्ता के चयन को बदलने की ज़रूरत नहीं है। – Miguel

+0

दूसरी विधि में आप rowData [कॉलम इंडेक्स] का उपयोग करते हैं। मुझे कॉलम इंडेक्स मिल सकता है क्योंकि मेरे पास कॉलम है (यह डेटाग्रिडसेल की एक संपत्ति है), लेकिन मुझे सही पंक्तिडेटा संरचना प्राप्त करने के लिए सेल की वर्तमान पंक्ति नहीं पता है। – Miguel

+0

@ मिगुएल: मैंने अपनी पोस्ट का उल्लेख किया है। मैं निश्चित रूप से व्यवहार का उपयोग करने की सिफारिश करेंगे। यह वास्तव में जटिल नहीं है और यह सब माता-पिता की पंक्ति के लिए खोज कर रहा है और आसपास कास्टिंग न तो अच्छी शैली है और न ही कुशल है। – Marc

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

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