2017-11-30 28 views
0

私は、さまざまなフォームをアクティブにするたくさんのボタンがある小さなメニューストリップアイテムを持っています。繰り返しを最適化する

1つのボタンのコードは次のようになります:

Form B1 = new Form1(); 
    private void Button1_Click(object sender, EventArgs e) 
     { 
      if (B1.Visible == false) 
      { 
       B1 = new Form1(); 
      } 

      B1.Visible = true; 
      B1.Activate(); 
     } 

は、私はまた、マウスenter-を持っており、イベントのまま:

private void Button1_MouseEnter(object sender, EventArgs e) 
    { 
     Button1.Text = "Something prdy intriguing"; 
    } 
    private void Button1_MouseLeave(object sender, EventArgs e) 
    { 
     Button1.Text = "Hi"; 
    } 

そしてツールチップ:今

private void Tooltips() 
{ 
ToolTip forB1 = new ToolTip(); 
forB1.SetToolTip(button1, "21.11.17"); 
} 

私は8つの異なるフォームのために約8つのボタンが必要だと想像してください、つまり、これらのすべてをやり直す必要があり、時間を無駄にし、たくさんのコードスペース。

とにかくこれらを圧縮することはできますか? これは私の世界の外にあります。どこから最適化を開始するのかはわかりません。

+0

このように、menuItemsに関しては、switch(){case:}を使用してmeunitemの名前を確認し、そこからビルドするなど、さまざまな方法があります。 – MethodMan

答えて

1

1つのオプションは、一つの関数にこのすべてを移動しているので、

AttachMenuStripButtonHandlers(Button1, B1, "on enter", "on leave", "tooltip"); 
+0

説明のために、フォームのコンストラクタの各ボタンに対してAttachMenuStripButtonHandlersメソッドを呼び出す必要があると言っていますか? –

+1

@MoonMooこれは今作者が行っているところです。フォームデザイナーでこれをやっているのなら、フォームのコンストラクターではい。 – Evk

+0

本当にこれはうまくいきますが、あなたのクリック機能は正しく機能していません。基本的に新しいフォームを開くことはできますが、閉じたり、削除したりすると、それ以上開くことはできません。 – Flame

0

あなたの質問の後半部分について、あなたはすべてのボタンに同じイベントハンドラをアタッチする必要があり、この

private void Button_MouseEnter(object sender, EventArgs e) 
{ 
    ((Button)sender).Text = "Something prdy intriguing"; 
} 
private void Button_MouseLeave(object sender, EventArgs e) 
{ 
    ((Button)sender).Text = "Hi"; 
} 

ような何かを行うことができます。

public void AttachMenuStripButtonHandlers(
    Button btn, 
    Form form, 
    string enterText, 
    string leaveText, 
    string tooltip) { 

    btn.Click += (sender, args) => { 
     form.Visible = true; 
     form.Activate(); 
    }; 
    btn.MouseEnter += (sender, args) => { 
     btn.Text = enterText; 
    }; 
    btn.MouseLeave += (sender, args) => { 
     btn.Text = leaveText; 
    }; 
    new ToolTip().SetToolTip(btn, tooltip); 
} 

そして、このような各ボタンのコールのために:

+0

良いソリューションが、私は実際には、私はまだそれを繰り返す必要があると思いますが、すべてのボタンの別のテキストが必要なので、全体的に最適化のための非常に柔軟性ではないこの部分のような気がしますが、 button1.mouseEnter.text = "これとそれ"?これは、私がデザイナーにイベントを解放するために旅行する必要がないことを意味するでしょう – Flame

+0

あなたは、カスタムテキストオブジェクトをボタンのタグプロパティに保持し、イベントハンドラでそれを引き出すことができます。何かこのように - button1.Tag =(EnterText = "My enter text"、LeaveText = "My leave text")。 –

0

私はちょっとここEVKのコード@盗むのですが、基本的にこれは動作します私がやりたかったやり方。私は私がしたいことは、それが開いEvksコードで行く、フォームが表示されているとき、それはそれを2回開いていないということですので、私は、タイプを取得する必要がありました代わりのフォームを取得して追加基本的に何

public void ButtonHandlers(Type NewForm) 
    { 

      NewButton.Click += (sender, args) => 
      { 
       Form TheNewMain = (Form)Activator.CreateInstance(NewForm); 
       if (TheNewMain.ShowDialog() != DialogResult.Cancel) 
       { 
        TheNewMain.Activate(); 
       } 
      }; 

はい、しかし閉鎖すると処分され、新しいインスタンスを作成することはできません。私はちょうどNewForm

ようにtypeof(formName)をお願いしなければならないコードで

おかげEVK!

関連する問題