8

この質問にはすでに答えがあります。

私のアプリケーションでは、ボタンの可視性を制御し、テキストフィールドとwinformヘッダーテキストを有効にするために、同じコンテキストを異なるコンテキストで実行しています。 私がこれを行うことにした方法は、単純に文字列をフォームコンストラクタに渡して、順番に目的のwinformの調整を含む2、3のifステートメントでそれをチェックすることです。

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

これはうまく機能しますが、 "Text"キーワードはReSharperによって次のメッセージが追加された青い斜めの線が表示されます。 これは潜在的な問題なのか、それともある種の過度に熱心なReSharperメッセージなのか。

私の実装の改善のためのどんな明確化や提案も大いに感謝されるでしょう。

4 답변


9

基本クラスctor内の仮想メンバー呼び出しできたサブクラスのctorが呼び出される前(したがって、オブジェクトが自身を整合性のある状態に初期化する機会を得る前)に、サブクラスで何らかのロジックを実行させます。

それはちょうどいい思い出ですので、あなたが潜在的にいくつかの厄介な予期せぬ動作を引き起こす可能性がある何かをしているのを知っています。


  • はい、これは私が自分自身で考えていた方向に沿っています。どうすればこれをより良くできるかについての提案はありません。安定性はこのプロジェクトの最優先事項であり、予想外の振る舞いを避けたいと思います。 - Sakkle
  • あなたは単にあなたの基本クラスctorの仮想メソッドを呼び出さないこと以外の提案を意味しますか? :-)この場合、データバインディングを使ってフォームのTextプロパティをGUIモデルクラスの文字列フィールドにバインドすることができます。それにはタイトルバーの表示内容を決めるために必要なロジックが含まれます。 - mookid8000
  • はい、どこから始めればよいのかわからず、ボタンとテキストフィールドについても同じようにしなければならないと思いますが、おそらく可能です。 - Sakkle

6

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

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


  • これは私が達成しようとしていることのための最も簡単で最良の解決策のように思えます。はい...私は怠け者です:P - Sakkle

4

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



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;
        }
    }
}


  • Ahaaa ...甘い:) - Sakkle
  • OnLoadメソッドをオーバーライドするだけで、独自のLoadイベントを購読する必要はありません。 - Ilya Ryzhenkov
  • うん、私はIlyaに賛成だ - メソッドをオーバーロードするほうがいいだろう。そうすればイベントの購読を中止することを忘れないでください(そしてこれは直感的なステートメントです)。 - ng5000
  • 「2番目の回答」を作成しないでください。混乱するだけです。この回答だけでは、「改善のための明確化や提案」は得られません。質問で需要。 - bzlm
  • 元の回答が削除され、この回答に置き換えられて、図のように更新されました。 - ng5000

リンクされた質問


関連する質問

最近の質問