3

データベースから取得したオブジェクトのリストにバインドされたSystem.Windows.Forms.ComboBoxから派生コントロールを作成したいと思います。他の開発者は、必要がない限り、データソースやバインディングについて心配することなく、このコントロールをフォームにドロップすることができます。

コンボボックスを拡張してから、コンストラクターでDataSource、DisplayMember、およびValueMemberを設定しようとしました。

public class CustomComboBox : ComboBox
{
    public CustomComboBox() 
    {
        this.DataSource = MyDAL.GetItems(); // Returns List<MyItem>
        this.DisplayMember = "Name";
        this.ValueMember = "ItemID";
    }
}

実行すると機能しますが、フォームに追加するとVisualStudioで多くのエラーが発生します。私が得るエラーは次のとおりです。

「プロパティ'Items'のコード生成に失敗しました。エラーは次のとおりです:'オブジェクト参照がオブジェクトのインスタンスに設定されていません」

これを実現する正しい方法は何ですか(C#、Winforms、.NET 2.0以降)?

4

3 に答える 3

6

問題は、設計者が実際にコンパイルと実行を、通常のプログラムの実行とはわずかに異なるコンテキストで行うことです。

コンストラクターでは、コードを次のようにラップできます。

if (!DesignMode)
{
  //Do this stuff
}

これにより、設計中に初期化コードを実行しないように設計者に指示できます。

于 2009-01-16T17:11:19.140 に答える
2

DesignMode プロパティはコンストラクターでは機能しません。しばらくグーグルで調べたところ、このLicenseManagerのものが見つかりました。

if (LicenseManager.UsageMode != LicenseUsageMode.Designtime)
{
    // Do your database/IO/remote call
}

ただし、LicenseManager はコンストラクターでのみ機能します。イベントハンドラには DesignMode を使用します。

ソース: http://dotnetfacts.blogspot.com/2009/01/identifying-run-time-and-design-mode.html

別の参照: http://weblogs.asp.net/fmarguerie/archive/2005/03/23/395658.aspx

于 2009-01-20T16:24:35.763 に答える
0

ここでの私の通常のコメント - DesignMode は、コントロールがデザイン サーフェイスに直接配置されている場合以外の状況では信頼できません。つまり、コントロールが別のコントロールに配置されている場合、デザイン モードであっても DesignMode は true ではありません。特に継承されたコントロールでは、デザイン モードであるかどうかを確認する信頼できる方法は見つかりませんでした。コントロールが非ビジュアル コントロール (例: コモン ダイアログ) から継承されている場合、Site を使用するバリアントでさえ信頼できません。

http://keyofdflat.livejournal.com/5407.htmlを参照してください(最後のコメントを必ずお読みください)。

于 2009-01-16T17:43:22.537 に答える