5

मैं निम्नलिखित सार्वजनिक संपत्ति के साथ एक UserControl बना लिया है:संपत्ति मूल्य के आधार पर डिज़ाइन-टाइम UserControl इंटरफ़ेस को कैसे अपडेट करें?

[Browsable(true)] 
public string Text 
{ 
    get { return pnlLookupTable.GroupingText; } 
    set { pnlLookupTable.GroupingText = value; } 
} 

pnlLookupTable आपने अनुमान लगाया होगा के रूप में, एक पैनल नियंत्रण, है। मैं प्रॉपर्टी विंडो में टेक्स्ट प्रॉपर्टी का मान बदल सकता हूं और यह मार्कअप में दिखाई देता है जैसे कि यह होना चाहिए। हालांकि, किसी पृष्ठ के अंदर UserControl का डिज़ाइन दृश्य पैनल के लिए अद्यतन GroupingText नहीं दिखाता है। मैं इसे कैसे प्राप्त कर सकता हूं?

संपादित:

अनुरोध करके, यहाँ पूरी क्लास जो करने के लिए है कि संपत्ति अधीन होती है।

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public partial class LookupTable : System.Web.UI.UserControl 
{ 
    [Browsable(true)] 
    public string Text 
    { 
     get { return pnlLookupTable.GroupingText; } 
     set { pnlLookupTable.GroupingText = value; } 
    } 
} 

और यहाँ .ascx फ़ाइल के प्रासंगिक हिस्सा है:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="LookupTable.ascx.cs" Inherits="LookupTable" %> 
<asp:Panel ID="pnlLookupTable" runat="server" GroupingText="Lookup Table"> 
    <%-- Irrelevant content here. --%> 
</asp:Panel> 

मैं कुछ पहचानकर्ता और अन्य तुच्छ चीजें बदल गई के स्वामित्व वाली प्रकृति की रक्षा के लिए आप विशेष चल रहा कोई बात नहीं देख सकते हैं कोड।

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

+0

आप अपने उपयोगकर्ता नियंत्रण कैसे लागू किया? कोड के साथ एक एएससीएक्स फ़ाइल के रूप में? या आपने एक कस्टम क्लास लिखा है जो UserControl से निकला है? कृपया अपने परिदृश्य से थोड़ा और कोड दिखाएं क्योंकि इससे उत्तर प्रभावित हो सकता है। – Eilon

+0

ईलॉन, मैंने अपनी पोस्ट अपडेट की है। देखने के लिए और कुछ नहीं है। :) –

+0

एक त्वरित अनुवर्ती: मुझे लगता है कि यह स्वीकार करने का समय है कि यह नहीं किया जा सकता है और आगे बढ़ सकता है। चूंकि यह वास्तव में सुविधा का मामला है, इसलिए यह कस्टम नियंत्रण बनाने या .ascx को संकलित करने की गारंटी नहीं देता है, हालांकि वे अच्छे सुझाव हैं। हर किसी के योगदान के लिए धन्यवाद। मैंने निश्चित रूप से कुछ चीजें सीखी हैं। –

उत्तर

6

मैं वापस UserControlDesigner कोड के लिए एक सा लगता होगा ...

लघु कहानी: मैं यह संभव है नहीं लगता।

मैं क्या याद से, उपयोगकर्ता ASCX फ़ाइलें में स्थित नियंत्रण डिजाइनर में कभी भी नहीं चला रहे हैं:

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

सीएलआर में इस सीमा के कारण उपयोगकर्ता नियंत्रण डिजाइनर वास्तव में एएससीएक्स फ़ाइल को संकलित या चलाता नहीं है। इसके बजाए, यह एएससीएक्स फ़ाइल को पार करता है और इसके अंदर नियंत्रण की तलाश करता है और यह इसके बजाय उन नियंत्रणों को लोड करता है। प्रत्येक नियंत्रण के लिए यह एएससीएक्स फ़ाइल में पाता है, यह संबंधित नियंत्रण डिजाइनर बनाएगा और उस नियंत्रण के डिजाइन समय HTML को प्रस्तुत करेगा।

  1. के बजाय एक ASCX उपयोगकर्ता नियंत्रण आपको लगता है कि नियंत्रण से निकला और कोड एक सीएस या VB फ़ाइल में लिखा है एक नियमित रूप से कस्टम नियंत्रण लिख सकते हैं का उपयोग कर:

    इस के आसपास काम करने के तरीके के एक जोड़े हैं ।

  2. एएससीएक्स को एक डीएलएल में संकलित करें। डेविड एबो ने इसे कैसे किया जाए इस पर blog post लिखा था।

कारण यह है कि इन दो समाधानों को काम करना चाहिए कि दोनों में एक डीएलएल में संकलित कोड शामिल है। विचार यह है कि डीएलएल अक्सर नहीं बदलता है इसलिए डीएलएल में बदलाव (और लीक मेमोरी) प्रत्येक बार इसे फिर से लोड करने के जोखिम के बिना डीएलएल लोड करने के लिए विजुअल स्टूडियो के लिए सुरक्षित है।

+0

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

+0

यह व्यवहार VS2005, VS2008, और VS2010 में समान है। मुझे इस व्यवहार को बदलने की कोई योजना नहीं है। – Eilon

+0

मैं सिर्फ इस बारे में पढ़ रहा था कि आप असेंबली क्यों नहीं उतार सकते हैं और यह बहुत दिलचस्प है। यह अब और अधिक समझ में आता है। –

1

मुझे यकीन है कि के लिए सोचा था कि मैं इस के लिए एक जवाब था, और यह सब बाहर लिखा था, लेकिन कुछ मुझे गुस्सा दिलाना था के बारे में यह तो मैं इसमें कुछ घंटों के लिए बाहर का परीक्षण समाप्त हो गया।

बाहर कर देता है (जैसे Eilon कहा), मुझे नहीं लगता कि यह है कि आप ऐसा कर सकते हैं।

ASCX नियंत्रण पूरी तरह से DesignerAttribute उपेक्षा है, तो आप उनके लिए एक कस्टम डिजाइन समय रेंडरर निर्दिष्ट नहीं कर सकते। मैंने सोचा "ठीक है, मैं पैनल नियंत्रण को उपclass कर सकता हूं और उस पर एक नया डिजाइनर निर्दिष्ट कर सकता हूं जो मूल नियंत्रण से गुण प्राप्त करेगा"। अंदाज़ा लगाओ? सवाल ही नहीं। आप डिजाइनर में पैनल की मूल नियंत्रण तक पहुंचते हैं तो यह कस्टम usercontrol प्रकार में ढाला नहीं होगा। मैं देख सकता हूं कि यह UserControl है, और यह संभवतः मेरे TestUserControl को छोड़कर कोई अन्य उपयोगकर्ता नियंत्रण नहीं हो सकता है, लेकिन अगर मैं इसे डालने का प्रयास करता हूं तो डिज़ाइनर क्लास अपवाद फेंकता है!

यह ईमानदारी से मेरे मन चल रही है। यह मूल रूप से वास्तव में क्या है जो एइलन कह रहा है - डिजाइन मोड में वेब उपयोगकर्ता नियंत्रण पर एक जानबूझकर प्रतिबंध है।

Here's a vague post from Steven Cheng suggesting that design time support is just a no-go for web usercontrols.

इस एक मजेदार मेरे लिए अवसर सीखने था, मैं रिपोर्ट करने के लिए है कि मुझे नहीं लगता कि एक .ascx इसे काट होगा माफी चाहता हूँ। मुझे पूरा यकीन है कि इसे एइलॉन जैसे डीएलएल को संकलित करने के लिए भी सुझाव नहीं दिया जाएगा। आपको शायद कस्टम नियंत्रण मार्ग जाना होगा।

+0

आपके प्रयासों के लिए धन्यवाद, गर्भ। यह मुझे थोड़ा गहरा खोदने में भी मदद करेगा। मैं स्वीकार करता हूं कि यह असंभव हो सकता है, लेकिन आप की तरह मैं उत्सुक हूं और जानना चाहता हूं कि क्यों। –

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