2009-07-12 65 views
9

我計劃的功能添加到文本框與以下:如何把一個擴展的WinForms控制上的工具箱

public class TextBoxExt : TextBox 
    { 
     protected override void OnKeyPress(KeyPressEventArgs e) 
     { 
      base.OnKeyPress(e); 
     } 

    } 

的問題是我們如何使用這個TextBoxExt?無論如何要把這個類放到工具箱上,這樣我們可以將它拖放到表單上?如果沒有,使用TextBoxExt的最佳方式是什麼?

回答

14
  1. 用TextBoxExt建立你的項目,確保它編譯好。
  2. 與窗體要在TextBoxExt,打開工具箱,點擊右鍵,選擇「選擇項」
  3. 瀏覽到您的.exe或者.dll文件,你在1編譯)
  4. 確保TextBoxExt有蜱在它旁邊,按OK
  5. TextBoxExt應該出現在工具箱中,將其拖動到窗體

(有這樣做,打開設計文件和重命名文本框的實例TextBoxExt但手工的另一種方式編輯設計器文件可能會被認爲是有害的)

+0

我已經做了很多擴展的控制,這就是將它們添加到表單的方式。您還可以將該項目添加到當前的解決方案中,還可以將對項目dll的引用(TextBoxExt)添加到您計劃使用TextBoxExt的項目中。 – 2009-07-13 06:10:01

3

項目中的任何自定義控件都應該自動顯示在工具箱中。我發現,有時在關閉重新打開的Visual Studio之前,控件纔會顯示。我認爲這個問題與緩存工具箱的內容有關。

+0

另外,確保您的項目/解決方案建立。 – 2011-02-17 21:26:53

0

您需要爲派生類添加一個構造函數。

public class TextBoxExt : TextBox  
{   
    public TextBoxExt() 
    { 
    } 

    protected override void OnKeyPress(KeyPressEventArgs e)   
    {    
     base.OnKeyPress(e);   
    }  
} 
+0

不是。沒有構造函數也是如此。 – 2009-07-13 08:03:18

0

您的控件應該自動出現在您的解決方案的工具箱中。爲了讓其他項目顯示它,您必須像其他人所說的那樣執行選擇工具箱項目。

如果您想提供特殊的設計時功能,那麼您還需要提供一些其他設計器相關的屬性,並且可能需要您自己從ControlDesigner派生的類。

0

幾小時前我陷入了這個陷阱。
我有一個.NET 2.0的Windows應用程序項目與一些自定義UserControls;它工作得很好。 因此,我決定在子文件夾中訂購我的文件,以使我的項目更清潔一些。
之後,Visual Studio 2010設計器停止加載我的表單,ToolBox將不再顯示我的控件。
我嚇壞了,移回項目根目錄中的源文件,重置ToolBox,但似乎沒有任何工作。 之後,我記得我用ReSharper「刪除未使用的參考」,所以我試圖放回未使用的參考,特別是System.Data:問題解決了! :O
我不能說你爲什麼,但這對我有效。
希望我的經驗可以幫助別人。 :)
Bye, Nando

0

我爲UltraGridBagLayoutPanel的自定義實現創建了一個空構造函數。儘管david.healed是正確的,但它並不是必需的,但在放置斷點時檢查表單是否初始化它正在使用您的類來實現您的自定義控件是非常有用的。

這本來是一個更容易修改設計文件,但我想它和控制來改變這個字段的類型,也改變了該領域的分配給我的自定義控件的新實例。

private Infragistics.Win.Misc.UltraGridBagLayoutPanel ultraGridBagLayoutPanel1; 
this.ultraGridBagLayoutPanel1 = new Infragistics.Win.Misc.UltraGridBagLayoutPanel(); 

private Athia.Reports.ultraGridBagLayoutPanel1 ultraGridBagLayoutPanel1; 
this.ultraGridBagLayoutPanel1 = new Athia.Reports.ultraGridBagLayoutPanel1(); 

這樣做會破壞Visual Studio的每一次,並修復它需要使用文本編輯器把它放回去一次。因此,除非任何人能夠描述我實施這種方法時出現了什麼問題,或許將這個類與控制名稱相同並不是一個好主意,我認爲唯一安全可靠的方法就是卡拉努斯在步驟1到5或者與之稍有偏差,因爲Rob Windsor正確地指出,重新啓動VS會自動將控制器帶入工具箱。不幸的是我,我則不得不改變所有的孩子從原來的類控制了我的定製類:-(。

6

我知道這是超級老問題,但也許還是爲別人有喜歡同樣的問題有用我 - 因爲它仍然在頂部谷歌:)

您可能會感興趣使用ToolboxItemAttribute(http://msdn.microsoft.com/en-us/library/system.componentmodel.toolboxitemattribute(v=vs.110).aspx)。

我這樣做是我的最終解決這個問題。

[ToolboxItem(true)] 
public class PanelTitle : LabelControl { 
    // Whatever code to override LabelControl here... 
} 

重建解決方案和擴展控件應顯示在工具箱中。

0

在同一個解決方案本應自動工作。但是,我發現如果目標框架不匹配,工具箱不會填充。 (我假設真的參考需要版本相同或低於引用的目標。)(我沒有得到關於不匹配框架的警告) 通過使這些目標框架相同,重新編譯,重新啓動VS.該控件正確填充。 (我還添加了的ToolboxItem(真)屬性)

相關問題