2009-07-12 1 views
9

に拡張WinFormsのコントロールを置くために、私は次のようにテキストボックスに機能を追加する予定:どのようにツールボックス

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

    } 

の質問はどのように我々はこのTextBoxExtを使用することができますか?このクラスをツールボックスに追加して、フォームにドラッグ&ドロップするだけですか?そうでない場合は、TextBoxExtを使用する最良の方法は何ですか?

答えて

14
  1. TextBoxExtでプロジェクトをビルドします。コンパイルが正常に行われていることを確認してください。あなたに
  2. あなたが上TextBoxExtをしたいフォーム、ツールボックスを開くと
  3. 、右クリックして、「項目を選択」を選択
  4. ブラウズ.exeまたはあなたが1でコンパイルされたDLL)
  5. はTextBoxExtはダニを持っていることを確認してください次の[OK]を押してそれに
  6. TextBoxExtは、ツールボックスに表示され、フォーム上にドラッグしなければならない

(TextBoxExtが、マニュアルには、テキストボックス(TextBox)コントロールのインスタンスを、これを行うデザイナーのファイルを開くと名前を変更する別の方法がありますデザイナーファイルの編集は危険なものとみなすことができます)

+0

私は多くの拡張コントロールを作成しており、これをフォームに追加する方法です。また、現在のソリューションにそのプロジェクトを追加したり、プロジェクトのDLL(TextBoxExt)への参照をTextBoxExtを使用する予定のプロジェクトに追加することもできます。 –

3

プロジェクトのカスタムコントロールは、自動的にツールボックスに表示されます。再オープンしたVisual Studioを閉じるまで、コントロールが表示されないことがあります。私は問題がツールボックスの内容をキャッシュすることと関係があると考えています。

+0

また、プロジェクト/ソリューションが構築されていることを確認してください。 –

0

派生クラスにコンストラクタを追加する必要があります。

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

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

本当にありません。コンストラクタなしでも動作します。 –

+0

申し訳ありませんが、私はコンストラクタを追加せずに試してみました。どのように自動的にコントロールでピックアップしていないかについてはあまり確かではありません。 – James

0

あなたのコントロールは、ソリューションのツールボックスに自動的に表示されます。他のプロジェクトでそれを表示させるには、ツールボックス項目の選択を行う必要があります。

特殊なデザイン時の機能を提供する場合は、デザイナー関連の追加の属性や、おそらくControlDesignerから派生した独自のクラスを追加する必要があります。

0

私はわずか数時間前にこのトラップに落ちました。
カスタムUserControlを持つ.NET 2.0 Windowsアプリケーションプロジェクトがあります。それは正常に働いた。 私はプロジェクトを少しきれいにするために、私のファイルをサブフォルダで注文することに決めました。
その後、Visual Studio 2010デザイナーがフォームの読み込みを停止し、ツールボックスにコントロールが表示されなくなりました。
プロジェクトルートでソースファイルを元に戻して、ツールボックスをリセットしても、何も動作していないようです。 その後、ReSharperの「未使用参照の削除」を使用していたので、私はを返しました。System.Data:問題が解決しました。 :O
私はあなたの理由を言うことはできませんが、これは私のために働いた。
私の経験が他の人を助けてくれることを願っています。 :)
Bye、 Nando

0

UltraGridBagLayoutPanelのカスタム実装用の空のコンストラクタを作成しました。 david.healedは必要ではありませんが、カスタムコントロールを実装するためにフォームを初期化するときにクラスを使用していることを確認するために、ブレークポイントを設定するのは非常に便利です。

デザイナーファイルを編集する方がずっと簡単でしたが、私はそれを試して、コントロールのフィールドタイプを変更し、カスタムコントロールの新しいインスタンスにフィールドの割り当てを変更しました。これを行う

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

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

は、Visual Studioを毎回破壊し、それが再びそれを戻すために、テキストエディタを使用する必要が修正します。したがって、誰かがこのアプローチの実装で間違っていることを記述できない限り、クラスをコントロール名と同じように呼び出すのは良い考えではないと思いますが、これを達成するための唯一の安全で信頼できる方法は、Calanusがステップ1 Robber WindsorがVSを再起動することを正しく指摘しているため、ツールボックスにコントロールが自動的に表示されます。残念なことに私は、元のクラスから私のカスタマイズしたクラスにすべての子コントロールを変更する必要があります:(。

6

これは超古い質問ですが、同じような問題がある私 - それはまだGoogleのトップにあります。

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

同じ解決策では、これは自動的に機能します。しかし、ターゲットフレームワークが一致しない場合、ツールボックスにデータが入力されないことがわかりました。 (私は本当にリファレンスは、リファレンスのターゲットと同じか、それより低いバージョンでなければならないと仮定しています)(一致しないフレームワークに関する警告を受け取りました) これらを同じターゲットフレームワークにすることで、再コンパイル、コントロールに正しく入力されます。 (私はToolboxItem(true)属性も追加しました)

関連する問題