2012-05-01 38 views
0

我有兩個自定義列表框類時:MethodNotFoundException添加用戶控件爲另一種形式

public class MyListBox : ListBox 
public class MyCheckedListBox : ListBox 

他們周圍的WinForms包裝System.Windows.Forms.ListBox控制增添了幾分實施和造型等

我加以下代碼分別爲了在必要時移除垂直滾動條:

private const int WS_VSCROLL = 0x00200000; 
private bool verticalScrollbar = true; 

[DefaultValue(true)] 
public bool VerticalScrollbar 
{ 
    get { return this.verticalScrollbar; } 
    set 
    { 
     if (this.verticalScrollbar != value) 
     { 
      this.verticalScrollbar = value; 
      this.RecreateHandle(); 
     } 
    } 
} 

protected override System.Windows.Forms.CreateParams CreateParams 
{ 
    get 
    { 
     System.Windows.Forms.CreateParams parms = base.CreateParams; 
     if (!this.verticalScrollbar) 
      parms.Style &= ~WS_VSCROLL; 
     return parms; 
    } 
} 

我將其中的一個添加到現有的用戶控件ol ProfileGeneralPanel並且它們按預期工作,默認情況下顯示滾動條,將VerticalScrollbar屬性設置爲false會將其刪除。雖然現在有必要在多個地方使用這種安排,所以我將這種結構提取到一個獨立的新用戶控件PrivilegesListView。這個新控件在表中有一個MyCheckedListBox和兩個MyListBox。所有三個都有VerticalScrollbar設置爲false。目前爲止,設計師都能正確顯示所有內容。

然而,當我試圖從工具箱這個控件拖到另一個用戶控件,將拋出一個異常,說明它無法找到方法:MyCheckedListBox.set_VerticalScrollbar(Boolean)

問題的方法顯然是一個屬性生成的方法。我已經嘗試了所有常見的,清理和重建,重新開始視覺工作室。絕望之餘,我還檢查了建築時產生的IL,並且MyCheckedListBox確實已經定義了該方法。任何想法,爲什麼它無法找到它?

注意注意控制器的設計者本身每次都打開罰款,它只有當它被添加到另一個表單時纔有問題。

注意,只有當VerticalScrollbar設置爲false,無論是在設計器生成的代碼PrivilegesListView或手寫在構造函數本身出現問題。

注:不幸的是,在這個階段,它不是可以使用像DataGridView代替列表框其他控件...

回答

3

這時候你以前添加控件工具箱與出錯「選擇項目「對話框。這使控制組件的副本存儲在保存工具箱項目組件的私人目錄中。現在你可能會看到這個錯誤,你在你的窗體上放置了一個控件的舊版本,一個還沒有添加的方法。

避免此陷阱的最佳方法是讓Visual Studio自動將您正在處理的控件添加到工具箱中。確保設置仍然正確,它通過不明智的嘗試來改善VS perf性能會有所改變。工具+選項,窗體窗體設計器,常規,AutoToolboxPopulate應設置爲True。然後,在您的解決方案中有一個派生自Control或Component的類的項目將在編譯後自動將其控件添加到工具箱的頂部。您對控制代碼所做的更改現在始終保持同步。

一般情況下,使用Fuslogvw.exe來解決程序集解析問題。它和VS一樣適用於你自己的程序。您想要記錄所有綁定,以便您還可以看到成功但可能從錯誤的文件夾中選取了該程序集的副本。

+0

雖然有趣的帖子,我還沒有手動添加任何東西到工具箱。兩個列表框類已經存在,他們只是用給定的代碼更新,並且新的用戶控件自動出現在那裏。 –

+0

這並沒有留下太多。不知何故,它正在某個地方找到該程序集的舊副本。您可以使用fuslogvw.exe並記錄所有綁定以獲取洞察。 –

+0

你的確是正確的,它是在我們衆多的輸出文件夾之一中完成裝配的舊副本。如果你想爲你的答案增加一些這樣的話,那麼我可以繼續接受它。 :) –