プロが教える店舗&オフィスのセキュリティ対策術

コンポーネントにListを使った自作プロパティを作ろうと
思ってます。

試しに作ってみて、フォームに貼り付けるところまではいいんですが、
その後に一度でもビルドをするとエラーになってしまって、
うまく動作させることができません。

エラーはエラーメッセージが出力されるのではなく、
フォームデザイナー上でおかしなHTMLが出力されるものです。
どうしたらうまくいくのでしょうか?


【ソース】
public partial class Component1 : TextBox
{
 public Component1()
 {
  InitializeComponent();
 }

 public Component1(IContainer container)
 {
  container.Add(this);

  InitializeComponent();
 }

 private List<TestData> _test = new List<TestData>();
 [Browsable(true)]
 public List<TestData> Test
 {
  get { return _test; }
  set { _test = value; }
 }
}

[Serializable]
public class TestData
{
 private string extensions = "*.*";

 public string Extensions
 {
  get { return extensions; }
  set { extensions = value; }
 }
 private string displayText = "すべてのファイル";

 public string DisplayText
 {
  get { return displayText; }
  set { displayText = value; }
 }

 public override string ToString()
 {
  return DisplayText;
 }
}

【エラー内容】
<html><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"><title></title><style>.ErrorStyle { font-family: tahoma; font-size: 11 pt; text-align: left}.DetailsStyle { font-family: tahoma; font-size: 10pt; text-align: left;text-indent: 0; word-spacing: 0; line-height: 100%; float: left; margin-top: 0; margin-bottom: 0}.StackStyleVisible { font-family: tahoma; font-size: 10pt; text-align: left; margin-left: 20; text-indent: 0}.StackStyleHidden { display:none; font-family: tahoma; font-size: 10pt; text-align: left; margin-left: 20; text-indent: 0}</style></head><body><DIV class="DetailsStyle" width="100%"><table border="0" width="100%" id="table1" height="100%" cellspacing="0" cellpadding="0"><tr><td height="40" bgcolor="#FF9999" width="8%" style="letter-spacing: 0" align="center"><img border="0" src="C:\Documents and Settings\yamaguti\Local Settings\Temp\27043E.tmp" width="35" height="35" alt="ErrorImage" ></td><td height="40" bgcolor="#FF9999" width="91%" style="vertical-align: top; letter-spacing: 0" align="left"><b><font size="2" face="Arial" fontsize="70%">繝・じ繧、繝翫・隱ュ縺ソ霎シ縺ソ譎ゅ↓ 1 縺、莉・荳翫・繧ィ繝ゥ繝シ縺檎匱逕溘@縺セ縺励◆縲ゅお繝ゥ繝シ縺ッ莉・荳九↓荳€隕ァ陦ィ遉コ縺輔l縺セ縺吶€ゅさ繝シ繝峨・螟画峩縺悟ソ・ヲ√↑繧ィ繝ゥ繝シ繧ゅ≠繧翫∪縺吶′縲√・繝ュ繧ク繧ァ繧ッ繝医r蜀榊コヲ繝薙Ν繝峨☆繧九→隗」豎コ縺ァ縺阪k繧ィ繝ゥ繝シ繧ゅ≠繧翫∪縺吶€�</font><font size="2" face="Arial"></font></b></td></tr><tr><td colspan="2" align="left" valign="top"><DIV id="div1" class="ErrorStyle" width="100%"><span style="font-weight: 600"><br>蝙� 'WindowsApplication1.TestData[]' 縺ョ繧ェ繝悶ず繧ァ繧ッ繝医r蝙� 'WindowsApplication1.TestData[]' 縺ォ螟画鋤縺ァ縺阪∪縺帙s縲� </span><br><a href="" id="details0">髱櫁。ィ遉コ</a><font color="#0000FF">&nbsp</font></DIV> </td> </tr> <tr><td colspan="2" align="left" valign="top"><DIV id="div20" class="StackStyleVisible" width="100%"><br> 蝣エ謇€ System.RuntimeType.CheckValue(Object value, Binder binder, CultureInfo culture, BindingFlags invokeAttr)<br> 蝣エ謇€ System.Reflection.RtFieldInfo.InternalSetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture, Boolean doVisibilityCheck, Boolean doCheckConsistency)<br> 蝣エ謇€ System.Reflection.RtFieldInfo.InternalSetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture, Boolean doVisibilityCheck)<br> 蝣エ謇€ System.Runtime.Serialization.FormatterServices.SerializationSetValue(MemberInfo fi, Object target, Object value)<br> 蝣エ謇€ System.Runtime.Serialization.ObjectManager.CompleteObject(ObjectHolder holder, Boolean bObjectFullyComplete)<br> 蝣エ謇€ System.Runtime.Serialization.ObjectManager.DoNewlyRegisteredObjectFixups(ObjectHolder holder)<br> 蝣エ謇€ System.Runtime.Serialization.ObjectManager.RegisterObject(Object obj, Int64 objectID, SerializationInfo info, Int64 idOfContainingObj, MemberInfo member, Int32[] arrayIndex)<br> 蝣エ謇€ System.Runtime.Serialization.Formatters.Binary.ObjectReader.RegisterObject(Object obj, ParseRecord pr, ParseRecord objectPr, Boolean bIsString)<br> 蝣エ謇€ System.Runtime.Serialization.Formatters.Binary.ObjectReader.ParseObjectEnd(ParseRecord pr)<br> 蝣エ謇€ System.Runtime.Ser

A 回答 (2件)

デザイナーに対するシリアル/デシリアルの方法を指示すればいいみたいです



ComponentクラスのTestプロパティの属性指定に
DesignerSerializationVisibility(DesignerSerializationVisibility.Content)
を追加してやればいいみたいですよ
    • good
    • 0
この回答へのお礼

できました!!!ありがとうございます。

ただ、調べてみても深い内容なようで、全く理解できないままですが・・・。
書籍類も、大体がアプリケーション作成がメインだったりして、
コンポーネント作成について深く突っ込んでくれてる書籍があると
大変嬉しいのですが、未だ出会っておらず、プロパティ制御には
毎度苦慮しております。

コードの意味及び記述すべきタイミングについては別途調べてみます。
今回は大変ありがとうございました。

お礼日時:2012/10/08 01:19

TestDataクラスのシリアル化の実装が原因のようですよ


具体的な解決方法までは持ち合わせておりませんが …

resxファイルに格納された コンポーネントのTestプロパティの項目を読み込む際にエラーになっているようです

ためしに
private string extensions = "*.*";

private string displayText = "すべてのファイル";

[NonSerialized]属性を与えてやると フォームで項目を追加した後でも エラーにならないようです

この回答への補足

うーん、ダメでした・・・。
フォームに追加した直後は問題ないのですが、リビルドを行うと
同じようにエラーになってしまいます。
パースにミスってるんだろうなというのは何となくわかったのですが、
じゃあどう対処すればいいのかというのが分からず困ってます・・・。

[Serializable]
public class TestData
{
 [NonSerialized]
 private string extensions = "*.*";

 public string Extensions
 {
  get { return extensions; }
  set { extensions = value; }
 }

 [NonSerialized]
 private string displayText = "すべてのファイル";

 
 public string DisplayText
 {
  get { return displayText; }
  set { displayText = value; }
 }

 public override string ToString()
 {
  return DisplayText;
 }
}

補足日時:2012/10/07 22:55
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!