0

(tabControlレイアウトに)多くのテキストボックスがあるフォームがあります。すべてのテキストボックスで右クリック機能を無効にしています。以下のコードを与えることによって:

        txtAmountChildPlans.ContextMenu = new ContextMenu();
        txtCityHome.ContextMenu = new ContextMenu();
        txtCityPersonal.ContextMenu = new ContextMenu();
        txtCityRetirement.ContextMenu = new ContextMenu();
        txtEmailCar.ContextMenu = new ContextMenu();
        txtEmailCarIns.ContextMenu = new ContextMenu();
        txtEmailHome.ContextMenu = new ContextMenu();
        txtEmailOp.ContextMenu = new ContextMenu();
        txtEmailPersonal.ContextMenu = new ContextMenu();
        txtEmailSenior.ContextMenu = new ContextMenu();
        txtEmailTwoIns.ContextMenu = new ContextMenu();
        txtFullNamePersonal.ContextMenu = new ContextMenu();
        txtManufacturerCar.ContextMenu = new ContextMenu();
        txtMobileCar.ContextMenu = new ContextMenu();
        txtMobileCarIns.ContextMenu = new ContextMenu();
        txtMobileHome.ContextMenu = new ContextMenu();
        txtMobileNoRetirement.ContextMenu = new ContextMenu();
        txtMobileOp.ContextMenu = new ContextMenu();
        txtMobilePersonal.ContextMenu = new ContextMenu();
        txtMobileSenior.ContextMenu = new ContextMenu();
        txtMobileTwoIns.ContextMenu = new ContextMenu();
        txtModelCar.ContextMenu = new ContextMenu();
        txtMonthlySalaryCar.ContextMenu = new ContextMenu();
        txtNameHome.ContextMenu = new ContextMenu();
        txtNameRetirement.ContextMenu = new ContextMenu();
        txtPensionRetirement.ContextMenu = new ContextMenu();
        txtRegCarIns.ContextMenu = new ContextMenu();
        txtRegTwoIns.ContextMenu = new ContextMenu();

編集:

        foreach (var textbox in this.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.tabHealth.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();
        }

とにかくこれをsigle関数で書くことはありますか?以下のコード?

これは私にはよく見えません。cssのようにc#ですべてのテキストボックスに同じプロパティを与える方法はありますか?

4

3 に答える 3

6

すべてのテキストボックスを列挙して、ループ内で新しいコンテキストメニューを作成できます

foreach (TextBox textbox in AllTextBoxes(this))
{
    textbox.ContextMenu = new ContextMenu();
}

public IEnumerable<TextBox> AllTextBoxes(Control control)
{
    List<TextBox> result = new List<TextBox>();
    result.AddRange(control.Controls.OfType<TextBox>());
    foreach (var childControl in control.Controls.OfType<Control>())
    {
        result.AddRange(AllTextBoxes(childControl));
    }
    return result;
}
于 2012-10-15T11:18:43.577 に答える
4

ネストされたコントロールがない場合、これらの線に沿って何かを行うことができます。

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

ネストされたコントロールを処理する必要がある場合は、拡張メソッドを使用して処理できます

public static class ControlExtensions
{
    public static IEnumerable<T> AllControlsOfType<T>(this Control control) 
        where T : Control
    { 
         T found = control as T;
         if(found != null)
         {
             yield return found;
         } 

         foreach (var child in control.Controls.Cast<Control>())
         {
            foreach (var item in AllControls<T>(child))
            {
               yield return item;
            }
         }
    }
}

このコードでフォームで使用できます

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

Extensionメソッドを保持する名前空間を必ず参照してください。

于 2012-10-15T11:19:31.350 に答える
2

以下のようなメソッドを作成できます。

private void AssignDataContext(params TextBox[] textboxes)
{
    foreach (var textbox in textboxes)
    {
        textbox.ContextMenu = new ContextMenu();
    }
}
于 2012-10-15T11:18:21.410 に答える