1

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

デバッグ後、問題は 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つのことは、コントロールを新しいWebサイトプロジェクトに追加すると上記のすべてが発生しますが、コントロールのプロジェクトのデバッグプロパティを外部プログラムを開始するように設定すると(私はビジュアルスタジオを開始します)、そこに新しいプロジェクトを作成して追加しますすべてが機能するように制御します。

4

1 に答える 1

2

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

コントロールのプロパティを使用して、DesignModeVisual 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 メソッドをオーバーライドし、ダミーのツールバーを提供するDesigner クラスを作成することです。

于 2009-12-01T11:31:27.377 に答える