2012-05-10 5 views
9

यहाँ माइक्रोसॉफ्ट के साथ इस मुद्दे को लॉग इन - रेप्रो डाउनलोड के लिए उपलब्ध है: https://connect.microsoft.com/VisualStudio/feedback/details/741454/value-change-event-doesnt-fire-for-datetimepicker-controls-used-in-vsto-add-insबग: नहीं कर सकते कि बाहर गिर एक DatePicker पर तिथियां चुनते हैं एक अस्थायी VSTO ऐड-में

आप एक एक्सेल VSTO में एक DateTimePicker डालें, तो अस्थायी जोड़े -इन और स्थिति यह इसलिए जब कैलेंडर नीचे चला जाता है, यह ऐड-इन के किनारे के बाहर है, यहाँ देखें:

enter image description here

दिनांक से किसी का चयन हरी कार्यों में परिक्रमा की अपेक्षा के अनुरूप है, लेकिन जब लाल रंग में घूमने वाली किसी भी तारीख पर क्लिक करके, यह कैलेंडर ड्रॉप डाउन बंद कर देता है और तिथि निर्धारित नहीं करता है!

क्या कोई जानता है कि मैं इसे कैसे ठीक कर सकता हूं?

संपादित

यह इतना उपयोगकर्ता WPF का उपयोग कर समस्या का अनुभव किया: VSTO WPF ContextMenu.MenuItem Click outside a TaskPane not raised

enter image description here

उस प्रश्न का उत्तर चलता मुद्दा एक समय पहले, लेकिन अभी भी कनेक्ट करने के लिए सूचित किया गया था कोई वीएसटीओ 4.0 एसपी 1 के साथ समाधान: https://connect.microsoft.com/VisualStudio/feedback/details/432998/excel-2007-vsto-custom-task-pane-with-wpf-context-menu-has-focus-problems

कामकाज में से एक का उपयोग करना है संदेशों को पंप करने के लिए डिस्पैचर फ्रेम और मेनू के लिए GotFocusEvent और LostFocusEvent की सदस्यता लें। http://blogs.msdn.com/b/vsod/archive/2009/12/16/excel-2007-wpf-events-are-not-fired-for-items-that-overlap-excel-ui-for-wpf-context-menus.aspx लेकिन मेनू के लिए यह सभी WPF कोड Winform DateTimePicker का समाधान नहीं है।

माइक्रोसॉफ्ट के लिए रेप्रो कनेक्ट:

नया प्रोजेक्ट> Excel 2010 ऐड-में

private void ThisAddIn_Startup(object sender, System.EventArgs e) 
{ 
    //setup custom taskpane 
    MyTaskView = new TaskPaneView(); 
    MyTaskView.currentInstance = Globals.ThisAddIn.Application; 
    MyTaskPane = this.CustomTaskPanes.Add(MyTaskView, "MyTaskView"); 
    MyTaskPane.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionFloating; 
    MyTaskPane.DockPositionRestrict = MsoCTPDockPositionRestrict.msoCTPDockPositionRestrictNoChange; 
    MyTaskPane.Visible = true; 
} 

फ़ाइल मेनू> में जोड़ें> नया प्रोजेक्ट> कक्षा लाइब्रेरी> TaskPane

नामित फिर टास्कपेन प्रोजेक्ट एक उपयोगकर्ता नियंत्रण बनाते हैं जिसे टास्कपेन व्यू

public partial class TaskPaneView : UserControl 
{ 
    public TaskPaneView() 
    { 
     InitializeComponent(); 
    } 

    public Microsoft.Office.Interop.Excel.Application currentInstance { get; set; } 

    public TaskPaneCtrl getTaskPaneCtrl 
    { 
     get { return this.taskPaneCtrl1; } 
    } 

} 

अगला एक DateTimePicker के साथ एक उपयोगकर्ता नियंत्रण बनाने के लिए, सुनिश्चित करें कि कैलेंडर नियंत्रण उपयोगकर्ता नियंत्रण

public partial class TaskPaneCtrl : UserControl 
{ 
public TaskPaneCtrl() 
{ 
    InitializeComponent(); 
} 
} 

F5 के नीचे दाईं ओर स्थित है बनाने के लिए और क्लिक करें कैलेंडर नियंत्रण, अब एक तारीख से बाहर है कि चयन का प्रयास टास्कपेन क्षेत्र कोई मूल्य परिवर्तन घटना आग नहीं है, यह कैलेंडर के बाहर एक क्लिक की तरह व्यवहार करता है!

नोट: मैंने एक ड्रॉप डाउनलिस्ट की कोशिश की जो नियंत्रण से गिरती है लेकिन इसकी घटनाएं आग लगती हैं!

उत्तर

7

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

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

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

ड्रॉपडाउन तीर ओवरलैप करने के लिए बटन प्राप्त करने के लिए कुछ उदाहरण कोड:

private void showMonthCalendar(object sender, EventArgs e) { 
     dateTimePicker1.Focus(); 
     using (var dlg = new CalendarForm()) { 
      dlg.DateSelected += new DateRangeEventHandler((s, ea) => dateTimePicker1.Value = ea.Start); 
      dlg.Location = dateTimePicker1.PointToScreen(new Point(0, dateTimePicker1.Height)); 
      dlg.ShowDialog(this); 
     } 
    } 

आप एक रूप CalendarForm के साथ:

public Form1() { 
     InitializeComponent(); 
     var btn = new Button(); 
     btn.BackgroundImage = Properties.Resources.DropdownArrow; 
     btn.FlatStyle = FlatStyle.Flat; 
     btn.BackColor = Color.FromKnownColor(KnownColor.Window); 
     btn.Parent = dateTimePicker1; 
     btn.Dock = DockStyle.Right; 
     btn.Click += showMonthCalendar; 
     dateTimePicker1.Resize += delegate { 
      btn.Width = btn.Height = dateTimePicker1.ClientSize.Height; 
     }; 
    } 

क्लिक करें ईवेंट हैंडलर एक संवाद है कि एक MonthCalendar शामिल दिखाने के लिए की जरूरत है उस सीमा को जोड़ें और इसमें केवल एक महीना कैलेंडर है:

public partial class CalendarForm : Form { 
    public event DateRangeEventHandler DateSelected; 

    public CalendarForm() { 
     InitializeComponent(); 
     this.StartPosition = FormStartPosition.Manual; 
     monthCalendar1.Resize += delegate { 
      this.ClientSize = monthCalendar1.Size; 
     }; 
     monthCalendar1.DateSelected += monthCalendar1_DateSelected; 
    } 

    void monthCalendar1_DateSelected(object sender, DateRangeEventArgs e) { 
     if (DateSelected != null) DateSelected(this, e); 
     this.DialogResult = DialogResult.OK; 
    } 
} 
+1

+1 शानदार! एसओएक्स (विजुअल केबी?) की तरह पढ़ता है, अगर यह सोमवार को कोशिश करते समय काम करता है, तो कोई भी शब्द मेरे आभार व्यक्त नहीं कर सकता है। भयानक exceeeded –

+1

स्तर। अच्छा एक हंस –

2

अटकलें:
बग तब होता है क्योंकि क्लिक संदेश भेजने के बाद डेटीमिपिकर की सतह प्रदान नहीं की जाती है।

उत्तर देने के लिए अगले चरण:
यदि उपलब्ध हो तो कुछ तृतीय पक्ष दिनांक समय पिकर नियंत्रणों के साथ परीक्षण करने का प्रयास करें। मुझे एहसास है कि यह एक पूर्ण उत्तर नहीं है क्योंकि मुझे अभी तक पता नहीं है कि यह आपकी समस्या को ठीक करेगा या नहीं।

अन्य संभावित उत्तर: नियंत्रण फिट करने के लिए टास्कपैन का आकार बदलें। यह बग को हल करेगा, लेकिन उपयोगकर्ता के दृष्टिकोण से थोड़ा अजीब दिखता है।

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