1

同じフォームに存在するすべてのテキストボックスに同じプロパティを与える方法。

      foreach (var textbox in this.Controls.OfType<TextBox>())
        {
            textbox.ContextMenu = new ContextMenu();
        }

上記のコードは、テキストボックスがネストされた形式でない場合にのみ機能します。

私のプロジェクトでは、tabcontrolに複数のタブページがあります。したがって、上記のコードを実装することはできません。しかし、私は以下のコードを実装することができます:

      foreach (TextBox textbox in this.Controls.OfType<TabControl>().SelectMany(tc => tc.Controls.OfType<TabPage>().SelectMany(page => page.Controls.OfType<TextBox>())))
        {
            textbox.ContextMenu = new ContextMenu();
        }
        foreach (var textbox in this.tabCarInsurance.Controls.OfType<TextBox>())
        {
            textbox.ContextMenu = new ContextMenu();
        }
        foreach (var textbox in this.tabHomeLoans.Controls.OfType<TextBox>())
        {
            textbox.ContextMenu = new ContextMenu();
        }
        foreach (var textbox in this.tabRetirement.Controls.OfType<TextBox>())
        {
            textbox.ContextMenu = new ContextMenu();
        }

ここでは、tabControlごとに実装しています。それでも私は好きではありません(私は世話をするためのより多くのタブページを持っているので)。上記のコードを減らす方法はありますか?

私は以下のコードを試しました:(動作していません

       foreach (var textbox in this.Controls.OfType<TabControl>().OfType<TextBox>())
        {
            textbox.ContextMenu = new ContextMenu();
        }

私は前の質問から上記のコード知識を得ました。

よろしくお願い
します。

4

4 に答える 4

3
 private void SetProperty(Control ctr)
    {
        foreach(Control control in ctr.Controls)
        {
            if (control is TextBox)
            {
                control.ContextMenu = new ContextMenu();               
            }
            else
            {
                if (control.HasChildren)
                {
                    SetProperty(control);
                }                    
            }
        }
    }
于 2012-10-15T12:46:37.187 に答える
1

再帰を使用して、すべてのコントロールサブコレクションを調べます。

void SetControl(ContextMenu menu, Control control)
{
    if (control is TextBox)
        control.ContextMenu = menu;
    else
    {
        foreach (Control c in control.Controls)
            SetControl(menu, c);
    }
}

すべてのテキストボックスが検索され、それらすべてに1つの同じコンテキストメニューが設定されます。

たとえば、フォームのOnLoadイベントハンドラから呼び出します。yourContextMenuフォームを定義したことを前提としています。

    private void Form1_Load(object sender, EventArgs e)
    {
        SetControl(yourContextMenu, this);
    }
于 2012-10-15T12:49:57.923 に答える
1

tabcontrolコンテナから呼び出される、それを行うための拡張メソッドはどうですか...

public static class ControlExtensions
{
    public static void SetContextMenuOnChildTextBoxes(this Control control)
    {
        if (control is TextBox)
        {
            control.ContextMenu = new ContextMenu();
        }
        if (control.Controls != null)
        {
            foreach (Control controlChild in control.Controls)
            {
                controlChild.SetContextMenuOnChildTextBoxes();
            }
        }
    }
}

これをコードの共通領域に配置して、この機能を必要とするすべての親から呼び出すことができます。

于 2012-10-15T12:51:21.117 に答える
0

試す:

private void CtxMenu(Control parent)
{
    foreach (Control child in parent.Controls)
    {
        if (child is TextBox)
        {
            (child as TextBox).ContextMenu = new ContextMenu(); 
        }
}
于 2012-10-15T12:48:39.593 に答える