2012-03-20 20 views
7

के रूप में चिह्नित नहीं है मुझे कुछ वास्तव में स्पष्ट याद आना चाहिए। मैं काफी सी # नई खेद अगर यह कुछ blindingly स्पष्ट है कर रहा हूँ, लेकिन साल के लिए C/C++ में प्रोग्रामिंग किया गया है,;)उपयोगकर्ता नियंत्रण संग्रह serializable

[नए समस्याओं के लिए संपादित करें देखें] मैं कोशिश कर रहा हूँ

UserControl युक्त एक नोड बनाएँ। मेरे पास WinForm डिजाइनर में नियंत्रण दिख रहा है और मैं इसमें नोड्स जोड़ सकता हूं। हालांकि जब मैं कोड को आज़माता हूं और चलाता हूं तो मुझे निम्न त्रुटि मिलती है:

Code generation for property 'Nodes' failed. Error was: 'Type App.Node' in Assembly 'App, version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

और फिर मैंने जो नोड्स जोड़े हैं, वे दिखाए गए हैं।

यह मुझे पागल ड्राइव करना शुरू कर रहा है, जहां तक ​​मैं देख सकता हूं, इसे धारावाहिक के रूप में चिह्नित किया गया है।

नोड के रूप में परिभाषित किया गया है इस प्रकार है:

[Serializable] 
public class Node : MarshalByRefObject 
{ 
    public Node() 
    { 
    } 

    public Node(String text) 
    { 
     this.Text  = text; 
     this.Checked = false; 
     this.Complete = false; 
    } 

    public String  Text  { get; set; } 
    public bool   Checked  { get; set; } 
    public bool   Complete { get; set; } 
    public bool   Selected { get; set; } 
}; 

मैं तो एक "संग्रह" को परिभाषित इस प्रकार है:

[Serializable] 
public class NodeCollection : List<Node> 
{ 
    public NodeCollection() : 
     base() 
    { 
    } 
}; 

दोनों संग्रह और नोड ही "Serializable" विशेषता के रूप में स्थापित किया है आप देख सकते हैं।

नोड्स संपत्ति त्रुटि में उल्लिखित

private NodeCollection  mNodes = new NodeCollection(); 

    [Category("Behavior")] 
    [Description("Nodes")] 
    public NodeCollection Nodes 
    { 
     get 
     { 
      return mNodes; 
     } 
    } 

इस प्रकार है तो किसी को क्या मैं गलत कर रहा हूँ यहाँ किसी भी विचार किया गया है परिभाषित किया गया है?

संपादित करें: Archeg की टिप्पणी के जवाब में यह मेरी UserControl है:

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

    protected override void OnPaint(PaintEventArgs pe) 
    { 
     Graphics graph = pe.Graphics; 

     int rowHeight = Font.Height + 2; 

     if (Nodes != null) 
     { 
      int yPos = 0; 
      foreach(Node node in this.Nodes) 
      { 
       // Calculate my various bounding boxes. 
       Rectangle nodeBounds = new Rectangle(Bounds.Left, yPos, Bounds.Width, rowHeight); 
       Rectangle lightBounds = new Rectangle(Bounds.Right - Font.Height, yPos, rowHeight, rowHeight); 
       Rectangle spannerBounds = new Rectangle(lightBounds.Left - Font.Height, yPos, rowHeight, rowHeight); 
       Rectangle checkBoxBound = new Rectangle(32, yPos, rowHeight, rowHeight); 
       Rectangle textBounds = new Rectangle(checkBoxBound.Right, yPos, Bounds.Width - (rowHeight * 2) - checkBoxBound.Right, rowHeight); 

       // Draw selection box. 
       Brush textColour = Brushes.Black; 
       if (node.Selected) 
       { 
        graph.FillRectangle(Brushes.Blue, nodeBounds); 
        textColour  = Brushes.Yellow; 
       } 

       // Draw node text. 
       graph.DrawString(node.Text, Font, textColour, textBounds); 

       // Draw Red/Green light 
       Image[] lightImages = new Image[] { CompleteLightImage, InCompleteLightImage }; 
       Image lightImage = lightImages[node.Complete ? 1 : 0]; 
       if (lightImage != null) 
       { 
        graph.DrawImage(lightImage, lightBounds); 
       } 

       // Draw Spanner Icon 
       if (SettingsImage != null) 
       { 
        graph.DrawImage(SettingsImage, spannerBounds); 
       } 
       // Draw check box. 
       VisualStyleRenderer renderer = null; 
       VisualStyleElement ve   = node.Checked ? VisualStyleElement.Button.CheckBox.CheckedPressed : VisualStyleElement.Button.CheckBox.CheckedNormal; 
       if (VisualStyleRenderer.IsElementDefined(ve)) 
       { 
        renderer = new VisualStyleRenderer(ve); 
       } 

       if (renderer != null) 
       { 
        renderer.DrawBackground(graph, checkBoxBound); 
       } 
       else 
       { 
        ControlPaint.DrawCheckBox(graph, checkBoxBound, node.Checked ? ButtonState.Checked : ButtonState.Normal); 
       } 
       yPos += Font.Height; 
      } 
     } 
    } 

    private NodeCollection  mNodes = new NodeCollection(); 

    [Category("Behavior")] 
    [Description("Nodes")] 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
    [MergableProperty(false)] 
    [Bindable(false)] 
    public NodeCollection Nodes 
    { 
     get 
     { 
      return mNodes; 
     } 
    } 

    public Image CompleteLightImage   { get; set; } 
    public Image InCompleteLightImage  { get; set; } 
    public Image SettingsImage    { get; set; } 
} 

मैं के बाद से मैं मूल रूप से "DesignerSerializationVisibility" विशेषता जो मदद की है करने के लिए संबंधित आम तौर पर तैनात कुछ संशोधनों बना दिया है, लेकिन मैं अब हो रही है निम्नलिखित निर्माण त्रुटि:

error MSB3103: Invalid Resx file. Could not load type App.Node, App, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null which is used in the .RESX file. Ensure that the necessary references have been added to your project.

संपादित 2: इसका ध्यान देने योग्य है कि अपनी समस्याओं के केवल जब मैं एन के एक झुंड को जोड़ने के होते हैं डिजाइनर में odes तो मुझे उपरोक्त Resx त्रुटि मिलती है। यदि मैं कोड से मैन्युअल रूप से नोड्स जोड़ता हूं तो यह सब काम करता है जैसा कि मैं उम्मीद करता हूं ...

+0

आप किस नियंत्रण का उपयोग करते हैं? क्या यह कस्टम है? – Archeg

+0

@ आर्चेग: यूप इसकी पूरी तरह से कस्टम यूजर कंट्रोल – Goz

+0

से सीधे व्युत्पन्न है क्या आप अपना यूजर कंट्रोल कोड पोस्ट कर सकते हैं? – Archeg

उत्तर

18

मुझे विश्वास है कि आप इस समस्या क्योंकि डिजाइनर स्वचालित रूप से सभी सार्वजनिक UserControl गुण क्रमानुसार करने की कोशिश करता है है: उस मामले आप के लिए बाध्य करेगा वी.एस. बजाय resx फ़ाइल में नोड सामग्री पैदा करने में में, बस इस तरह के कोड उत्पन्न करते हैं।इस संपत्ति के अपने कस्टम UserControl डिजाइन समय समर्थन के लिए की जरूरत नहीं है, तो आप जोड़ सकते हैं "DesignerSerializationVisibility" विशेषता:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 

या बस छोड़ संपत्ति के get{} और set{} तरीकों और एक सार्वजनिक क्षेत्र के रूप में उपयोग।

उम्मीद है कि यह मदद करता है!

+1

इसका सही समाधान है। तुमने मुझे बचाया। –

2

यह बहुत अजीब है। मैंने इसे अपने नोट पर स्थानीय रूप से पुन: उत्पन्न किया है, फिर नोड क्लास को किसी अन्य प्रोजेक्ट में ले जाया गया और यह काम किया। मुझे लगता है कि यह परिपत्र निर्भरताओं के साथ कुछ है - यह आपकी असेंबली को खोजने का प्रयास करता है (मेरे मामले में यह WindowsFormsAplication1) बनाया गया था, लेकिन ऐसा नहीं हो सकता क्योंकि यह अभी इसे बना रहा है।

आशा है कि आपकी मदद करें, और मैं आगे खोदने की कोशिश करूंगा।

अद्यतन इसे हल करने का एक और तरीका: नोड क्लास से [सीरियलाइजेशन] विशेषता हटाएं।

// Form1.designer.cs: 
Node node1 = new Node(); 
node1.Checked = false; 
node1.Complete = false; 
node1.Selected = false; 
node1.Text = null; 
this.contr1.Nodes.Add(node1); 
+0

समस्या के लिए एक और समाधान जोड़ा गया – Archeg

+0

नीचे एक अतिरिक्त संपादन जोड़ा गया। मूल रूप से समस्या डिजाइनर के साथ कुछ गलत होने के साथ झूठ बोलती है ... अगर यह आपको – Goz

+0

हाँ में मदद करता है, तो ऐसा लगता है कि वीएस निर्माण के नियंत्रण पर धारावाहिक डेटा उत्पन्न करने में विफल रहता है। क्या आपको दिमाग है अगर मैं इसे माइक्रोसॉफ्ट के लिए एक बग के रूप में पोस्ट करता हूं, क्योंकि मैं कुछ सार्थक स्पष्टीकरण नहीं ढूंढ पाया था? – Archeg

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