1


0

CompositeControlおよび設計時エラー時のXMLデシリアライゼーション

コントロールを正しく表示するページを実行すると、コントロールを設計モードでWebフォームに配置した場合にのみ発生する「エラーレンダリングコントロール」エラーが発生します。+ 上記のステートメントは重要ではありません。返されるtoolbarsオブジェクトはnul lです。

デバッグ後、問題はCeateChildControls()から呼び出される関数にあります。

public static ToolBars LoadToolbarsFromConfigFile()
{

      ToolBars toolbars;
      Assembly executingAssembly = Assembly.GetExecutingAssembly();
      string resource = "Editor.ConfigFiles.ToolBars.xml";
      using (Stream stream = executingAssembly.GetManifestResourceStream(resource))
      {
            XmlSerializer serializer = new XmlSerializer(typeof(ToolBars));
            toolbars = (serializer.Deserialize(stream)) as ToolBars;

      }
      return toolbars;
}

ツールバーはnullを返します! (デザインモード)+しかし、ページを実行すると、ツールバーは適切なデータを返します。

私のコードについてさらに情報が必要な場合は、お問い合わせください。

更新:

指定したファイルではなくファイルストリームを使用する場合、アセンブリで何かする必要があります、それは動作します。

別の更新:

コードを少し変更し、テスト用に「データセット」を追加しました。

using (DataSet ds = new DataSet())
{
    ds.ReadXml(typeof(TheEditor).Assembly.GetManifestResourceStream("Editor.ConfigFiles.ToolBars.xml"));
    //show message box to see if it works
    System.Windows.Forms.MessageBox.Show(ds.Tables.Count.ToString());
}

私が気づいたもう1つのことは、新しいウェブサイトプロジェクトにコントロールを追加するときに上記のすべてが発生しますが、コントロールのプロジェクトのデバッグプロパティを設定して外部プログラムを起動し(私はVisual Studioを起動します)、そこで新しいプロジェクトを作成して追加しますすべてを制御します。

1 Answer


2


これをVisual Studio内で実行している場合、アプリケーションコンテキストがないため、その上で "GetExecutingAssembly"を実行できません-より正確には、実行アセンブリはdevenv.exeであり、リソースがありませんあなたが探しています。

コントロールのhttp://msdn.microsoft.com/en-us/library/system.web.ui.control.designmode.aspx [DesignMode]プロパティを使用して、コントロールをレンダリングしているかどうかを確認できますVisual Studio内で、適切に動作を変更します。

public static ToolBars LoadToolbarsFromConfigFile()
{
  ToolBars toolbars;
  if (!DesignMode)
  {
    Assembly executingAssembly = Assembly.GetExecutingAssembly();
    string resource = "Editor.ConfigFiles.ToolBars.xml";
    using (Stream stream = executingAssembly.GetManifestResourceStream(resource))
    {
      XmlSerializer serializer = new XmlSerializer(typeof(ToolBars));
      toolbars = (serializer.Deserialize(stream)) as ToolBars;
    }
  }
  else
  {
    // Load a dummy toolbar here.
  }
  return toolbars;
}

または、呼び出し元のコードでチェックを実行できますが、これはパブリックメソッドであるため、すべての呼び出し元がこのチェックを実行するという保証はないため、メソッドで実行する方が適切です。

最後のオプションは、LoadToolbarsFromConfigFileメソッドをオーバーライドし、ダミーを提供するhttp://msdn.microsoft.com/en-us/library/system.web.ui.design.webcontrols.compositecontroldesigner.aspx[Designerクラスの作成]です。あなたのためのツールバー。