0

アプリケーションに、BindingSource にバインドされた DataGrid を表示するフォームがあります。行をダブルクリックすると、詳細フォームが表示されます。

私はこれらの「ブラウズ」フォームを 50 近く持っており、詳細フォームが付属しています。ベース ブラウズ フォームを作成し、それに適切な BindingSource を渡すことで、フォーム (およびコード) の数を減らしたいと考えています。私はこれを機能させています。ただし、行をダブルクリックすると、渡された BindingSource に関連する詳細フォームをインスタンス化する必要があります。

たとえば、ユーザーが Customer テーブルを参照している場合は Customer Detail フォームが開きますが、Job テーブルを参照している場合は Job Detail フォームが開きます。

一般的な詳細フォームをパラメーターとして渡すことはできますが、渡されたフォームを正しい型の 1 つにキャストしてインスタンス化するにはどうすればよいでしょうか?

(私は、渡された正しいフォームを選択するために循環する大きな switch ステートメントを避けようとしています。確かに、これを達成するためのよりエレガントな方法はありますか?)

[編集] 私のブラウズ フォーム コードは次のようにインスタンス化されます。

public BaseBrowse(BindingSource dataClass, DevExpress.XtraEditors.XtraForm crudForm)
    {
        InitializeComponent();
        bs   = dataClass;
        crud = ((CRUDEquipment)(crudForm));
    }

したがって、私のダブルクリックイベントは次のとおりです。

    private void gvw_DoubleClick(object sender, EventArgs e)
    {
        Int32 nID = Convert.ToInt32(gvw.GetFocusedRowCellValue("ID"));
        ((CRUDEquipment)(crud)).intID = nID;
        ((CRUDEquipment)(crud)).Show();                
    }

「CRUDEquipment」を必要な形に置き換える方法が必要です。

4

1 に答える 1

0

たぶん、これらのいずれかが役立ちます



public void Instantiate<T>()
{
    var myObject = Activator.CreateInstance<T>();
    // Do something with myObject
}

public void Instantiate(Type t)
{
    var myObject = Activator.CreateInstance(t);
    // Do something with myObject
}

public void Instantiate(string typeName)
{
    var detailType = Type.GetType(typeName);

    if (detailType == null)
    {
        throw new InvalidOperationException("Nice try, but type {0} doesn't compute :)");
    }

    var myObject = Activator.CreateInstance(detailType);
    // Do something with myObject
}

于 2012-05-10T01:53:03.420 に答える