2017-04-05 5 views
5

मेरे पास निम्नलिखित परिभाषा के साथ एक WPF डेटाग्रिड है।मैं बाहरी अनुप्रयोग में ड्रैग और ड्रॉप को लागू करने के लिए WPF DataGrid व्यवहार को ओवरराइड कैसे करूं?

<DataGrid Name="DataGridFoo" 
    AutoGenerateColumns="False" 
    ItemsSource="{Binding GridData}" 
    IsReadOnly="True" 
    SelectionMode="Extended" 
    SelectionUnit="CellOrRowHeader"> 

यह मुझे उपयोगकर्ता को कोशिकाओं का "क्षेत्र" चुनने की अनुमति देता है। डेटाग्रिड एक अवलोकन संग्रह से जुड़ा हुआ है। XAML स्तंभ परिभाषाओं कुछ कॉलम, छिपा हुआ है इस तरह की कुछ दिखाई दे:

<DataGrid.ContextMenu> 
    <ContextMenu FontSize="16" Background="#FFE6E9EC"> 
    <MenuItem Header="Contact" Click="Contact_Click" /> 
    <Separator /> 
    <MenuItem Header="Copy" Command="Copy" /> 
    </ContextMenu> 
</DataGrid.ContextMenu> 

मैं चाहूँगा क्लिक करने के लिए सक्षम होने के लिए:

<DataGridTextColumn Binding="{Binding InvoiceID}" 
    Header="Invoice ID" 
    Visibility="Hidden" 
    Width="Auto"/>     
<DataGridTextColumn Binding="{Binding InvoiceNumber}" 
    Header="Invoice Number" 
    Visibility="Visible" 
    Width="Auto"/> 
<DataGridTextColumn 
    Binding="{Binding InvoiceDate, StringFormat=\{0:MM/dd/yy\}}" 
    Header="Invoice Date" 
    Visibility="Visible" 
    Width="Auto"/> 

मैं भी एक माउस के दाहिने बटन संदर्भ मेनू डेटा ग्रिड के लिए परिभाषित किया गया है , वर्तमान में चयनित कक्षों की एक प्रति बाहरी अनुप्रयोग में खींचें और छोड़ें। मैं ड्रैगड्रॉप ऑपरेशन शुरू करने के लिए "Alt Key" और बाएं माउस बटन दबाकर संयोजन का उपयोग करने के बारे में सोच रहा था।

उदाहरण के लिए, डेटा ग्रिड में कोशिकाओं की "अनियमित" चयन पर विचार करें:

enter image description here

मैं कैसे आगे बढ़ना है पर स्पष्ट नहीं कर रहा हूँ और इस संबंध में कई प्रश्न हैं:

1) मैं किन घटनाओं को ओवरराइड करता हूं ताकि वामपंथी माउस क्लिक वर्तमान में चयनित कोशिकाओं को प्रभावित न करे?

2) मैं कैसे निर्धारित करूं कि बाएं माउस बटन क्लिक चयनित कक्षों के क्षेत्र में हो रहा है या नहीं? मैं डेटा टुकड़ा कैसे संभाल सकता हूं?

3) एक बार मैंने ऊपर निर्धारित किया है, तो अगला कदम क्या है? बाहरी ड्रॉप पर उपयोग के लिए क्लिपबोर्ड में डेटा कॉपी करें?

4) क्या काम करने के लिए मुझे डेटाग्रिड पर ओवरराइड करने की आवश्यकता है (यदि कोई है)?

धन्यवाद

उत्तर

0

बुनियादी घटनाओं खींचने और छोड़ने के लिए कर रहे हैं: events to drag and drop

विशेष DragLeave छोड़ के आप क्या चाहते हैं क्या करना है। फिर आपको मूल्यों को खोजने और स्थानांतरित करने के लिए अपने वीएम से ग्रिडडेटा संपत्ति को नियंत्रित करने (हटाने/जोड़ने) की आवश्यकता है। मैं टेलरिक की तरह तीसरी पार्टी को दृढ़ता से अनुशंसा करता हूं।

+0

धन्यवाद, लेकिन मुझे नहीं लगता कि आप समझ रहे हैं कि मैं क्या पूछ रहा हूं। मैं जानता हूं और ड्रैग और ड्रॉप और इसकी संबंधित घटनाओं से काफी परिचित हूं। मैं डेटाग्रिड में कोशिकाओं का एक गुच्छा चुनने की कोशिश कर रहा हूं और फिर उन्हें बाहरी अनुप्रयोग में खींच सकता हूं। इसे कॉपी और पेस्ट करने के लिए शॉर्टकट के रूप में सोचें। मैं डाटाग्रिड में कोशिकाओं को हटा या जोड़ नहीं रहा हूं। मैं यह पूछ रहा हूं कि मैं इसे प्राप्त करने के लिए मानक WPF डेटाग्रिड के व्यवहार/ईवेंट हैंडलिंग को कैसे ओवरराइड कर सकता हूं। – JohnB

0

मेरा पूरा जवाब मेरा विश्वास है।

private void dataGridMaster_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
    { 
     if(Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift) & e.ChangedButton == MouseButton.Left) 
     { 
      DataGrid grid = e.Source as DataGrid; 
      DataGridCell cell = GetParent<DataGridCell>(e.OriginalSource as DependencyObject); 
      if(grid != null && cell != null && cell.IsSelected) 
      { 
       e.Handled = true; 
       StartDragAndDrop(grid); 
      } 
     } 
    } 

    private T GetParent<T>(DependencyObject d) where T:class 
    { 
     while (d != null && !(d is T)) 
     { 
      d = VisualTreeHelper.GetParent(d); 
     } 
     return d as T; 

    } 

    private void StartDragAndDrop(DataGrid grid) 
    { 
     StringBuilder sb = new StringBuilder(); 
     DataRow row = null; 
     foreach(DataGridCellInfo ci in grid.SelectedCells) 
     { 
      DataRowView drv = ci.Item as DataRowView; 
      string column = ci.Column.Header as string; 
      if(drv != null && column != null) 
      { 
       if(drv.Row != row && row != null) 
       { 
        sb.Length--; 
        sb.AppendLine(); 
        row = drv.Row; 
       } 
       else if(row == null) 
       { 
        row = drv.Row; 
       } 
       sb.Append(drv[column].ToString() + "\t"); 
      } 
     } 
     if (sb.Length > 0) 
     { 
      sb.Length--; 
      sb.AppendLine(); 
     } 
     DragDrop.DoDragDrop(grid, sb.ToString(), DragDropEffects.Copy); 
    } 

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

क्लिपबोर्ड किसी भी ड्रैग और ड्रॉप ऑपरेशन के लिए महत्वपूर्ण है। आप क्या कर रहे हैं क्लिपबोर्ड पर विभिन्न प्रारूपों में डेटा डाल रहा है कि ड्रॉप का लक्ष्य पहचान जाएगा। इस उदाहरण में केवल सादा पाठ का उपयोग किया जाता है। लेकिन आप समृद्ध टेक्स्ट या एचटीएमएल या अन्य प्रारूपों को बनाना चाहते हैं।

बाहरी अनुप्रयोग जो आप पर छोड़ रहे हैं को ड्रॉप लक्ष्य के रूप में पंजीकृत होना चाहिए। आप ड्रॉप को जवाब देने के लिए अन्य ऐप को मजबूर नहीं कर सकते ... इसे इसके लिए सुनना होगा। तो यह उदाहरण वर्ड और एक्सेल के साथ काम करेगा। यह नोटपैड के साथ काम नहीं करेगा।

मेरा मानना ​​है कि सभी 4 आइटम संतुष्ट हैं:

  1. अवहेलना पूर्वावलोकन माउस नीचे घटना।
  2. माउस ईवेंट का मूल स्रोत डेटा ग्रिड सेल से आता है। यदि सेल चुना जाता है तो आप चयनित कक्षों के ब्लॉक के भीतर होते हैं।
  3. चयनित कोशिकाओं के लिए, बाइंडिंग से डेटा इकट्ठा करें और एक ग्रिड में व्यवस्थित करें। आधारभूत आधार के रूप में सादा पाठ का उपयोग करें लेकिन वैकल्पिक रूप से अन्य प्रारूप भी जोड़ें। वास्तव में ड्रैग और ड्रॉप को लागू करने के लिए ड्रैगड्रॉप क्लास का उपयोग करें।
  4. पूर्वावलोकन माउस को ओवरराइड करें।
संबंधित मुद्दे