10

私のアプリケーションでは、ボタンの表示、テキスト フィールドの有効化、および winform ヘッダー テキストを制御するために、異なるコンテキストで同じ winform を実行しています。私がこれを行うことにした方法は、単純に文字列をフォーム コンストラクターに渡し、必要な winform の微調整を含むいくつかの if ステートメントでチェックすることです。

if (formContext == "add")
{
    Text = "Add member";
}
if (formContext == "edit")
{
    Text = "Change role";
    userTextBox.Enabled = false;
    searchButton.Visible = false;
}

これは正常に機能しますが、「テキスト」キーワードには、ReSharper によって追加された青い波線が追加され、次のメッセージが表示されます: コンストラクターでの仮想メンバー呼び出し。これは潜在的な問題なのか、それとも過度に熱狂的な ReSharper メッセージなのか.

私の実装を改善するための説明や提案は大歓迎です。

4

4 に答える 4

9

基本クラスの ctor で仮想メンバーを呼び出すと、サブクラスの ctor が呼び出される前に (したがって、オブジェクトが一貫した状態に初期化される前に)、サブクラスで一部のロジックが実行される可能性があります

これは、予想外の厄介な動作を引き起こす可能性のあることを行っていることを認識しているため、良い思い出に過ぎません。

于 2009-01-19T12:57:21.080 に答える
6

既存の回答に加えて、フォームの場合、Load イベント ハンドラーを追加できます。

Load += delegate
{
    if (formContext == "add")
    {
        Text = "Add member";
    }
    if (formContext == "edit")
    {
        Text = "Change role";
        userTextBox.Enabled = false;
        searchkButton.Visible = false;
    }
};
于 2009-01-19T13:20:37.850 に答える
4

クラスを封印するだけです。

于 2009-01-19T15:18:37.003 に答える
0

クラスを次のように書き直すことをお勧めします。

public partial class Form1 : Form
{
    public enum FormContextMode
    {
        Add,
        Edit
    }

    private FormContextMode m_mode = FormContextMode.Add; 

    public Form1( FormContextMode mode )
    {
        InitializeComponent();
        m_mode = mode;
        Load += delegate { UpdateForm(); };
    }

    private void UpdateForm()
    {
        if( m_mode == FormContextMode.Add )
        {
            Text = "Add member";    
        }
        else if( m_mode == FormContextMode.Edit )
        {
            Text = "Change role";
            userTextBox.Enabled = false;
            searchkButton.Visible = false;
        }
    }
}
于 2009-01-19T14:41:45.970 に答える