2011-01-28 21 views
5

क्या इस तरह के फैशन में एक विधि तैयार करना संभव है, यह जानता है कि इसे बाहर निकलने पर उत्तराधिकार में स्वचालित रूप से अगली विधि को कॉल करना होगा?एक विधि के बाद स्वचालित रूप से एक विधि को कॉल करने का एक क्लीनर तरीका?

निम्नलिखित उदाहरण में, मुझे इस घटना के बाद मेरे फॉर्म को पुन: पेश करने के कारण Refresh() पर कॉल करना होगा। समस्या यह है कि, Refresh() पर कॉल करने के लिए बदसूरत है, उदाहरण के लिए, 20 अलग-अलग ईवेंट जो फ़ॉर्म को रीफ्रेश करना चाहिए। उदाहरण के लिए:

private void PriorityLine_Click(object sender, EventArgs e) 
{ 
    _showPriorityLine = (_showPriorityLine) ? false : true; 
    Refresh(); // Must call refresh for changes to take effect. 
} 

मुझे लगता है कि मैं क्या तलाश कर रहा हूँ हस्ताक्षर किसी तरह मैं विधि के लिए आवेदन कर सकते हैं यह स्वचालित रूप से, विधि के बगल में श्रृंखला के लिए जहां अपने नाम से भले ही पैदा करने के लिए है। उदाहरण के लिए:

(मैं जानता हूँ कि इस वाक्य रचना सही नहीं है।)

private void PriorityLine_Click(object sender, EventArgs e).Refresh() 
{ 
    _showPriorityLine = (_showPriorityLine) ? false : true; 
} 

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

+4

ऑफ-विषय, पहले कथन को '_showPriorityLine =! _showPriorityLine' ' – Ani

+0

के रूप में लिखने पर विचार करें क्या आप इन हैंडलर को डिजाइनर से सेट कर रहे हैं? – Ani

+0

@ धन्यवाद एनी - करेंगे। –

उत्तर

3

ध्वनि क्या आप चाहते हैं की तरह पहलू उन्मुख प्रोग्रामिंग है, अलग अलग व्यवस्थाएं की एक संख्या सामान "जादुई" होने के बाद तरीकों के कुछ सेट चलाने के लिए आप सक्षम करने के लिए देखते हैं यहाँ एक नज़र AOP programming in .Net?

+0

+1 ओपी का वर्णन करने के लिए सही नाम देने के लिए केवल एक ही होने के लिए – meagar

+0

एक हथौड़ा - या यहां तक ​​कि एक अंगूठे - एक स्लेजहैमर का उपयोग करने का कोई कारण नहीं है। – Pedro

-1

एक ऐसी संपत्ति का उपयोग करें जो सेटर में ताज़ा करें।

+1

यह इवेंट हैंडलरों की बजाय संपत्ति सेटर्स को अपनी "समस्या" चलाता है। वह अभी भी एक ही जगह में, पहले की तरह ही एक ही समस्या है। –

+0

@ एंथनी तकनीकी रूप से नहीं ... अगर _showGridLines अपनी संपत्ति ShowGridLines के माध्यम से सेट किया गया है इसके चरम उदाहरण बनाम ...रीफ्रेश केवल एक ही स्थान पर बुलाया जाएगा और 2 लाइनों को ShowGridLines =! ShowGridLines के साथ बदल दिया जाएगा; –

+1

बस रिकॉर्ड के लिए, मैंने डाउनवोट की आपूर्ति नहीं की थी। @Aaron, संभवतः, उनकी 20+ घटनाएं विभिन्न चर या गुणों को बदल रही हैं, इसलिए उन 20+ घटनाओं में 20+ गुण होंगे, जो अभी भी 20+ विभिन्न स्थानों में 'ताज़ा करें)' छोड़ देंगे। जब तक कि मैं या तो कुछ पूरी तरह गलत नहीं पढ़ रहा हूं या मान रहा हूं। –

1

मैं है मुझे किसी भी वास्तव में साफ तरीके से अवगत नहीं है। एक विधि PostSharp का उपयोग करना होगा।

0

आप उन परिवर्तनों को समाहित कर सकते हैं जो फॉर्म को फॉर्म-स्तरीय गुणों में रीफ्रेश करने का कारण बनेंगे।

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

private bool _showPriorityLine; 
private bool ShowPriorityLine 
{ 
    get { return _showPriorityLine; } 
    set 
    { 
     _showPriorityLine = value; 
     Refresh(); 
    } 
} 

फिर अपने घटना सिर्फ

private void PriorityLine_Click(object sender, EventArgs e) 
{ 
    ShowPriorityLine = !ShowPriorityLine; 
} 
बेशक

होगा, जो केवल अपने कोड को साफ करता है, तो आपको लगता है कि करने के लिए प्रपत्र का कारण एक ही चर जोड़ तोड़ कई घटनाओं है जलपान की जरुरत है।

+0

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

+0

उस सवाल, निस्संदेह, कई बार पूछा गया है। कुछ वोटिंग इस साइट पर एक रहस्य है। पैक के बाद लोगों के साथ बहुत कुछ करना है। यहाँ पर cliques और पंथ अनुवर्ती भी हैं। कभी-कभी दो उत्तरों में एक ही बात होती है (एक ही समय में पोस्ट की जाती है) और उनमें से एक को वोट दिया जाएगा जबकि दूसरा नहीं होगा। अब, विशेष रूप से आपके उत्तर में, जेम्स के उत्तर पर मेरी टिप्पणी देखें। वही आप पर लागू होता है। मुझे नहीं पता कि आप नीचे क्यों मतदान कर चुके थे और उन्होंने नहीं किया। मुझे संदेह है कि वह "खूबसूरत लोगों" में से एक है, हालांकि। – Pedro

+0

+1 को संतुलित करने के लिए +1 जैसा कि हमारे पास एक ही विचार है। @ पेड्रो - मुझे नहीं पता कि मेरा जवाब कभी भी डाउनवॉट नहीं हुआ है, फिर भी एरिक ने किया, शायद ऐसा इसलिए था क्योंकि खान एक सामान्य/एक्स्टेंसिबल समाधान से अधिक था। या हो सकता है कि लोग लोगों के साथ आपकी पीठ और आगे पढ़ने में बहुत व्यस्त थे: पी आईएमओ आपका समाधान कम हो गया क्योंकि आपने मूल रूप से * मांग की थी कि यह सही समाधान था और फिर अपने पैरों को मुद्रित कर दिया क्योंकि कोई भी सहमत नहीं था। यह तय करने के लिए ओपी पर निर्भर करता है कि कौन सा समाधान उनकी आवश्यकताओं के अनुरूप है। हम सब कुछ कर सकते हैं हमारे 2 सेंट ... – James

-5

कुछ इस तरह:

private void RefreshAfter(Action action) 
    { 
     action(); 
     Refresh(); 
    } 

UPDATED यह और भी स्पष्ट करने के लिए:

private void DoSomeUiShiznit(Action action) 
    { 
     action(); 
     // other parts of the code don't realize that Refresh has to be called. 
     // But that's cool. I got it covered. 
     Refresh(); 
    } 

    private void PriorityLine_Click(object sender, EventArgs e) 
    { 
     DoSomeUiShiznit(() => { _showPriorityLine = !_showPriorityLine; }); 
    } 

अद्यतन - बस लेट-मतदाताओं के लिए एक संदेश:

क्या से कुछ आप देखकर बहुत अंधे हैं कि यह सब कुछ अलग नहीं है:

[SomeRefreshAttribute] 
private void PriorityLine_Click(object sender, EventArgs e) 
{ 
    _showPriorityLine = !_showPriorityLine; 
} 

सिवाय इसके कि यह आसान है, और समाधान में एक और ढांचा जोड़ने की आवश्यकता नहीं है। और फिर भी दूसरा जवाब यह बताता है कि जितना ज्यादा वोट नहीं मिलता है!

आपके साथ क्या गलत है?

+0

@ जॉर्ज: इसे स्पष्ट करने के लिए अपडेट किया गया है कि इसका उपयोग कैसे किया जाए। कोई शुल्क नहीं। – Pedro

+1

@ पेड्रो यह तर्क से विधि के इंटरफ़ेस को अलग करने के साथ समस्या को प्रभावी ढंग से हल नहीं करता है। मुझे अभी भी अपनी DoSomeUiShizit विधि को मैन्युअल रूप से कॉल करने की आवश्यकता होगी, जो केवल एक ही परिणाम प्राप्त करने के लिए अतिरिक्त चरणों को जोड़ने के लिए काम करेगा। –

+0

@ जॉर्ज: हाँ, यह तर्क को अलग करता है। कहीं, किसी भी तरह, आपको यह निर्दिष्ट करना होगा कि ताज़ा करें() को कॉल करने की आवश्यकता है। आप कुछ विशाल ढांचे को पेश कर सकते हैं, या यदि आप चाहें तो हुप्स के माध्यम से बहुत सारे कूदते हैं। हालांकि, यह विधि आपके सभी अन्य कोड से जटिल तर्क को अलग करती है। यदि आपको केवल ताज़ा करें() से अधिक करने की आवश्यकता है, तो आप इसे आसानी से जोड़ सकते हैं। या आप इसे हटा सकते हैं। और अन्य कोड को विवरण जानने की आवश्यकता नहीं है। आगे बढ़ें और एओपी पर पढ़ने के घंटे बिताएं, या पोस्टशर्प आदि का उपयोग करें। मेरी विधि प्रभावी ढंग से आपकी समस्या का समाधान करने का सबसे आसान तरीका है। – Pedro

0

आपकी विशेष समस्या और समाधान पोस्ट किए गए विचारों को ध्यान में रखते हुए, मैं कहूंगा कि "स्वच्छतम" दृष्टिकोण केवल Property Changed Notification को फॉर्म में आंतरिक उपयोग के लिए लागू करना होगा यानी आपको इस कार्यक्रम को बेनकाब करने की आवश्यकता नहीं है एमएसडीएन उदाहरण।

इस तरह आप उन संपत्तियों की एक आंतरिक सूची बनाए रख सकते हैं जिन्हें आप जानते हैं कि फ़ॉर्म को ताज़ा करने की आवश्यकता होगी उदा।

private List<string> _refreshProps = new List<string>(); 
    private bool _showPriority; 

    public void Form() 
    { 
     _refreshProps.Add("ShowPriority"); 
     ... etc 
    } 

    // only implement properties like this that need some extra work done 
    public bool ShowPriority 
    { 
     get { return _showPriority; } 
     set 
     { 
      if (_showPriority != value) 
      { 
       _showPriority = value; 
       // Call OnPropertyChanged whenever the property is updated 
       OnPropertyChanged("ShowPriority"); 
      } 
     } 
    } 

    // basic property that doesn't require anything extra 
    public bool AnotherProperty { get; set; } 

    public void Refresh() 
    { 
     // refresh the form 
    } 

    protected void OnPropertyChanged(string name) 
    { 
     if (_refreshProps.Contains(name)) 
      Refresh(); 
    } 

इस दृष्टिकोण का लाभ यदि भविष्य में आप विशेष गुण के बाद आप बस एक और सूची को लागू करने और अपने OnPropertyChanged विधि में फिर से संभाल कर सकते हैं अन्य "सामान" ऐसा करने के लिए आवश्यक है।

+0

इसके साथ एक समस्या यह है कि आप कई बार रीफ्रेश() को कॉल कर सकते हैं क्योंकि आपने कई गुणों को बदल दिया है - जब आवश्यक था तो अंत में ताज़ा करें() को कॉल करना था। – Pedro

+0

@ पेड्रो - अच्छा बिंदु, हालांकि आप एक झंडा पेश कर सकते हैं जो इसे होने से रोक सकता है यानी 'ताज़ा करें> 0'। मैं बस एक आधार देने की कोशिश कर रहा हूं जिससे ओपी काम कर सके। – James

0

Refresh पर कॉल न करें, Invalidate पर कॉल करें। आपको जिस तंत्र की आवश्यकता है वह पहले ही विंडोज में बनाई गई है। कॉलिंग Invalidate बस एक नोट बनाता है कि खिड़की को पुनर्भुगतान की आवश्यकता है। ऑपरेटिंग सिस्टम अंततः एक WM_PAINT संदेश पोस्ट करेगा (आमतौर पर रूट डिस्पैच मैसेज कॉल खत्म होने के बाद, लेकिन सटीक कार्यान्वयन अप्रासंगिक है)।

+0

हालांकि यह अच्छी सलाह है, जिसे मैं ध्यान में रखूंगा, रीफ्रेश का उपयोग करना सिर्फ एक उदाहरण है, और सवाल का आधार नहीं है। :) –

+0

आप सही हैं, मैं पूरी तरह से प्रश्न को गलत तरीके से पढ़ता हूं। उसके लिए माफ़ करना। – Tergiver

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

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