2008-11-11 10 views
10

मैं एक वस्तु है कि एक धागा शुरू होता है, एक फ़ाइल को खोलता है, और अन्य वर्गों से निवेश के लिए इंतजार कर रहा है है। चूंकि यह इनपुट प्राप्त करता है, यह डिस्क पर लिखता है। असल में, यह एक धागा सुरक्षित डेटा लॉगिंग वर्ग है ...नेट विंडोज फॉर्म्स डिजाइन समय नियमों

यहां अजीब हिस्सा है। जब मैं डिजाइनर में एक फॉर्म को खोलने (दृश्य   स्टूडियो   2008) वस्तु फ़ाइल बनाई हो जाता है का उपयोग करता है। यह स्पष्ट रूप से डिजाइन समय vhost प्रक्रिया के तहत चल रहा है ...

अजीब बात यह है कि मैं किसी अन्य परियोजना में इस मुद्दे को पुन: उत्पन्न करने में सक्षम नहीं हूं। मुझे यकीन नहीं है कि कोड के लिए नियम क्या हैं जो डिजाइनर और कोड में निष्पादित हो जाते हैं। उदाहरण के लिए, विंडोज फॉर्म कन्स्ट्रक्टर में एक फाइल बनाने से वास्तव में डिज़ाइन समय पर फ़ाइल नहीं बनती है ...

स्पष्टीकरण क्या है? क्या कोई संदर्भ है?

उत्तर

11

यह कोड जांचने के समय में है या नहीं, यह जांचने के लिए आप लाइसेंस प्रबंधक का उपयोग मोड देख सकते हैं।

System.ComponentModel.LicenseManager.UsageMode == System.ComponentModel.LicenseUsageMode.Designtime

यहां एक त्वरित उदाहरण है:

using System; 
using System.ComponentModel; 
using System.Windows.Forms; 

namespace Test 
{ 
    public class ComponentClass : Component 
    { 
     public ComponentClass() 
     { 
      MessageBox.Show("Runtime!"); 
     } 
    } 
} 

जब इस घटक डिजाइनर में अपने फ़ॉर्म में जोड़ने हो जाता है, तो आप तुरंत संदेश बॉक्स प्राप्त होगा। यदि कोड डिजाइन समय

using System; 
using System.ComponentModel; 
using System.Windows.Forms; 

namespace Test 
{ 
    public class ComponentClass : Component 
    { 
     public ComponentClass() 
     { 
      if (LicenseManager.UsageMode != LicenseUsageMode.Designtime) 
      { 
       MessageBox.Show("Runtime!"); 
      } 
     } 
    } 
} 

में नहीं है तो बयान को जोड़ने के बाद

इसे रोकने के लिए आप अगर बयान की जांच करने के लिए एक सरल जोड़ सकते हैं, messagebox नहीं रह गया है प्रकट होता है जब घटक रूप में जोड़ा जाता डिजाइनर के माध्यम से।

मुझे आशा है कि इस मदद करता है।

-जेरेमी

0

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

आपके द्वारा प्राप्त मूल कक्षाओं में ईवेंट करने से बचने का प्रयास करें।

2

आप भी इस का उपयोग करता है, तो दृश्य स्टूडियो डिजाइनर कोड चल रहा है की जाँच करने के सकता है:

public static bool DesignMode 
{ 
    get { return (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv"); } 
} 
फिर Form_Load में

:

if (!DesignMode) 
{ 
    // Run code that breaks in Visual Studio Designer (like trying to get a DB connection) 
} 

बहरहाल, यह कम है LicensManager.UsageMode का उपयोग करने से सुंदर, लेकिन यह काम करता है (जब तक माइक्रोसॉफ्ट प्रक्रिया दृश्य स्टूडियो के अधीन ही कार्य का नाम बदलता है)।

+0

मैन, आपकी "कम सुरुचिपूर्ण" विधि केवल काम करती है। LicensManager.UsageMode काम नहीं करता है उदा। जब डिजाइनर उपयोगकर्ता नियंत्रण के 'संपत्ति प्राप्त' विधि का आह्वान कर रहा है। – Soonts

11

डिजाइनर में उस वर्ग को संपादित करते समय नियंत्रण या फ़ॉर्म का निर्माता निष्पादित नहीं होता है (न ही ऑनलोड को कॉल किया जाता है)। मैं कभी कभी इस का उपयोग किया है डिजाइनर में एक मान सेट करने (जैसे। इसके बच्चे को बनाने डिजाइनर के सभी दर्शनीय नियंत्रित करता है), लेकिन निर्माता में एक अलग डिफ़ॉल्ट मान पर उनमें से कुछ को ओवरराइड (जैसे। कुछ बच्चे नियंत्रण छुपा जो केवल वे दिखाई देंगी कुछ परिस्थितियों में, जैसे स्टेटस बार पर संकेतक)।

हालांकि, कन्स्ट्रक्टर निष्पादित हो जाता है यदि नियंत्रण किसी अन्य नियंत्रण या डिज़ाइनर में फ़ॉर्म के रूप में रखा जाता है। ऑनलोड भी निष्पादित हो जाता है। यह हो सकता है कि डिज़ाइनर में आपका लॉगिंग कोड गलती से ट्रिगर हो रहा था।

, क्रम बनाम डिजाइन का पता लगाने an answeranother question करने के लिए कुछ emperical मूल्यों कुछ आम तरीके से वापस लौटे दिखा परीक्षण के स्क्रीनशॉट है। ऐसा प्रतीत होता है कि डिजाइनर में संपादित किए जा रहे फॉर्म या नियंत्रण के बच्चे के नियंत्रण (दो स्तर नीचे) का एक बाल नियंत्रण अपने स्वयं के DesignMode == झूठ को देखता है, इसलिए सामान्य संपत्ति जांच कोड की रक्षा करने में विफल हो जाएगी (उदाहरण के लिए ऑनलोड मोड में) डिजाइनर में जोड़े गए नियंत्रण में घोंसले नियंत्रण के लिए। यदि आप डिज़ाइनमोड की जांच कर रहे थे, जैसा कि कोई उम्मीद करेगा, यह घोंसला हो सकता है जिससे यह उस चेक के आसपास हो जाता है। यह हमेशा रचनाकार के भीतर DesignMode == झूठ देखता है।

यह भी ध्यान दें कि लाइसेंस प्रबंधक। उपयोग मोड चेक केवल निर्माता के भीतर DesignTime देखता है; जब ऑनलोड को कॉल किया जाता है तो यह रनटाइम लाइसेंस कॉन्टेक्स्ट के भीतर होता है। सबसे पूरा समाधान लाइसेंसमैनगर की जांच करना प्रतीत होता है। नियंत्रण मोड या नियंत्रक (या घटक) के कन्स्ट्रक्टर में उपयोग करें और सेटिंग को सदस्य चर या संपत्ति में सहेजें, जिसे आप बाद में जांच सकते हैं ताकि चलने वाले कोड से बचें जो डिजाइनर में कभी नहीं चलना चाहिए यहां तक ​​कि घोंसला भी। another answer में अन्य प्रश्न भी है जो घोंसले के लिए जिम्मेदार है लेकिन केवल कन्स्ट्रक्टर के बाहर काम करता है।

public static bool IsAnyInDesignMode(Control control){ 
    while(control != null){ 
     if(control.Site != null && control.Site.DesignMode) 
      return true; 
     control = control.Parent; 
    } 
    return false; 
} 

इस मामले में जहां नियंत्रण एक बच्चे एक और नियंत्रण के द्वारा बनाई गई है संभालता है:

+0

मुझे लगता है कि यह मेरी मदद कर सकता है। धन्यवाद! ++ – John

+0

सुधार: इससे मेरी मदद मिली। :) – John

+0

कूल! सुन के अच्छा लगा। –

2

ठीक है, के बाद से इस वैसे भी पुनर्जीवित किया गया है, यहाँ समारोह मैं निर्धारित करने के लिए मैं डिज़ाइन मोड में हूँ उपयोग करते हैं। DesignMode संपत्ति केवल डिजाइनर द्वारा बनाए गए नियंत्रणों के लिए सेट है।