2009-11-26 41 views
1

我得到「錯誤呈現控制」錯誤,只有當我將控件放置在設計模式下的Web窗體上時,如果我運行頁面,控件顯示正確。
上面的語句並不重要,發生此錯誤是因爲返回的工具欄對象是nul l。CompositeControl和XML反序列化在設計時錯誤

經過調試,問題是在是從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());  
}  

,我注意到另一件事,所有上述當我添加發生我控制一個新的網站項目,但如果我設置控制項目的調試屬性來啓動外部程序(我開始Visual Studio),並在那裏創建一個新項目並添加控件一切正常。

+0

你能證實GetManifestResourceStream在設計時返回一個值嗎? – 2009-12-01 11:24:10

+0

@Programming Hero,是的,它返回{System.IO.UnmanagedMemoryStream},和運行時一樣。 – markiz 2009-12-01 12:02:18

回答

2

當您在Visual Studio中運行此應用程序時,您沒有應用程序上下文,因此您無法對其執行「GetExecutingAssembly」 - 或者更準確地說,執行程序集是devenv.exe,沒有你正在尋找的資源。

您可以使用控制的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;     
} 

,你可以在調用執行檢查代碼,但由於這是一個公共方法,所以不能保證所有的調用者都會執行這個檢查,所以你最好在這個方法中做。

最後一個選項是create a Designer class,它會覆蓋LoadToolbarsFromConfigFile方法併爲您提供虛擬工具欄。

+0

哇,壞消息....所以有沒有辦法指示設計師控制的大會加載資源?我不喜歡爲虛擬工具欄添加特殊代碼的想法。 – markiz 2009-12-01 11:38:33

+0

也鋤頭我可以使用虛擬工具欄它我需要將它的圖像保存在資源以及? – markiz 2009-12-01 11:54:22

+0

那麼,「加載虛擬工具欄」方法可能會嘗試查看項目資源,但是我認爲您會在項目中添加大量的代碼和依賴項,而這些代碼和項目不一定會存在於服務器上 - 查看一下在Telerik控件中,它們不會在設計圖面上顯示工具欄:http:// tv。telerik.com/radtips/radeditor/radeditor-for-asp.net-ajax-+-share-toolbars-using-the-toolproviderid :( – 2009-12-01 12:13:13