2011-12-25 9 views
6

मैं एक एक्सेल ऐड पर काम कर रहा हूं जिसमें उपयोगकर्ता रिबन बार पर एक बटन क्लिक करने के बाद एक Winform खुलता है। इस बटन को गैर-मोडल होने की आवश्यकता है ताकि उपयोगकर्ता अभी भी मूल विंडो के साथ बातचीत कर सके, लेकिन यह हर समय मूल विंडो के शीर्ष पर भी रहना चाहिए। इसे पूरा करने के लिए मैं शो() विधि में पैरामीटर के रूप में पैरेंट विंडो को पारित करने का प्रयास कर रहा हूं। यहाँ मेरी कोड है:आप मालिक विंडो को दिखाने के लिए कैसे पास करते हैं() विधि अधिभार?

Ribbon1.cs

private void button2_Click(object sender, RibbonControlEventArgs e) 
    { 
     RangeSelectForm newForm = new RangeSelectForm(); 

     newForm.Show(this); 
    } 

इस कोड के साथ समस्या है कि शब्द 'इस' संदर्भ रिबन वर्ग, नहीं माता पिता खिड़की। मैंने ग्लोबल्स में गुजरने की भी कोशिश की। यह AddIn.Aplication.Windows.Parent। इसका परिणाम रनटाइम त्रुटि में होता है "System.Windows.Forms.Form.Show (System.Windows.Forms.IWin32Window) के लिए सबसे अच्छा ओवरलोडेड विधि मिलान कुछ अमान्य तर्क है"। दिखाने के लिए पैरेंट विंडो को पास करने का सही तरीका क्या है()?

यदि यह प्रासंगिक है, तो यह एक Office 2010 ऐप है जिसे .NET 4.0 पर सी # का उपयोग किया गया है।

संपादित करें --- Slaks के आधार पर उत्तर

using Excel = Microsoft.Office.Interop.Excel; 

... 

     class ArbitraryWindow : IWin32Window 
     { 
      public ArbitraryWindow(IntPtr handle) { Handle = handle; } 
      public IntPtr Handle { get; private set; } 
     } 

     private void button2_Click(object sender, RibbonControlEventArgs e) 
     { 
      RangeSelectForm newForm = new RangeSelectForm(); 
      Excel.Application instance = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"); 
      newForm.Show(new ArbitraryWindow(instance.Hwnd)); 
     } 
+0

वास्तव में और अधिक सटीक होना करने के लिए, खिड़की मैं रिबन से आग की कोशिश कर रहा हूँ एक Telerik Radform है। – hughesdan

+0

यह एक _compile-time_ त्रुटि है। – SLaks

+0

आपको एडिन गुणों से एप्लिकेशन को अधिक आसानी से प्राप्त करने में सक्षम होना चाहिए। – SLaks

उत्तर

14

आप एक वर्ग है कि IWin32Window लागू करता है और एक्सेल के Application.Hwnd संपत्ति रिटर्न बनाना होगा।

उदाहरण के लिए:

class ArbitraryWindow : IWin32Window { 
    public ArbitraryWindow(IntPtr handle) { Handle = handle; } 
    public IntPtr Handle { get; private set; } 
} 

newForm.Show(new ArbitraryWindow(new IntPtr(Something.Application.Hwnd))); 
+0

मुझे "अज्ञात सदस्य ExcelAddIn2.Globals का अनुप्रयोग" मिल रहा है " – hughesdan

+0

मुझे पता नहीं है कि एक्सेल 'एप्लिकेशन' उदाहरण कहां से ढूंढें, लेकिन आपके पास एडिन से एक होना चाहिए। – SLaks

+0

मुझे इसे माइक्रोसॉफ्ट.ऑफिस.इंटरोप.एक्ससेल में मिला। लेकिन यह तय करने के बाद कि अब मैं "अज्ञात कन्स्ट्रक्टर रिबन 1 प्राप्त कर रहा हूं। ExcelAddIn2.Ribbon1.ArbitraryWindow के अनियंत्रित विन्डो (int)। विवरण के लिए मेरे प्रश्न में संपादन देखें। – hughesdan

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