C# 无论如何,以减少我的文本框常见代码

C# 无论如何,以减少我的文本框常见代码,c#,C#,我有一个表单,其中有许多文本框(在tabcontrollayout中)。我正在禁用所有文本框上的右键单击功能。通过给出以下代码: txtAmountChildPlans.ContextMenu = new ContextMenu(); txtCityHome.ContextMenu = new ContextMenu(); txtCityPersonal.ContextMenu = new ContextMenu(); txtCit

我有一个表单,其中有许多文本框(在tabcontrollayout中)。我正在禁用所有文本框上的右键单击功能。通过给出以下代码:

        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(此.Controls.OfType()中的var文本框)
{
textbox.ContextMenu=新建ContextMenu();
}
foreach(此.tabCarInsurance.Controls.OfType()中的var文本框)
{
textbox.ContextMenu=新建ContextMenu();
}
foreach(此.tabHealth.Controls.OfType()中的var文本框)
{
textbox.ContextMenu=新建ContextMenu();
}
foreach(此.tabHomeLoans.Controls.OfType()中的var文本框)
{
textbox.ContextMenu=新建ContextMenu();
}
foreach(此.tabRetirement.Controls.OfType()中的var文本框)
{
textbox.ContextMenu=新建ContextMenu();
}
是否有任何方法可以在单函数中编写此函数。还是更少的代码


我觉得这不太好。在c#和css中有什么方法可以给所有文本框赋予相同的属性吗?

您可以创建如下方法

private void AssignDataContext(params TextBox[] textboxes)
{
    foreach (var textbox in textboxes)
    {
        textbox.ContextMenu = new ContextMenu();
    }
}

您可以枚举所有文本框,并在循环中创建新的上下文菜单

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;
}
foreach(所有文本框中的文本框文本框(此))
{
textbox.ContextMenu=新建ContextMenu();
}
公共IEnumerable AllTextBox(控件)
{
列表结果=新列表();
AddRange(control.Controls.OfType());
foreach(control.Controls.OfType()中的var childControl)
{
结果.AddRange(所有文本框(childControl));
}
返回结果;
}

如果没有嵌套控件,您可以按照以下方式执行操作:

foreach(var textbox in Controls.OfType<TextBox>())
{   
    textbox.ContextMenu = new ContextMenu();
}
foreach(Controls.OfType()中的var textbox)
{   
textbox.ContextMenu=新建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;
            }
         }
    }
}
公共静态类控制扩展
{
公共静态IEnumerable AllControlSoftType(此控件)
其中T:控制
{ 
T found=作为T的对照;
如果(找到!=null)
{
发现收益率;
} 
foreach(control.Controls.Cast()中的var child)
{
foreach(所有控件中的var项(子项))
{
收益回报项目;
}
}
}
}
此代码可以在您的表单中使用

foreach(var textbox in this.AllControlsOfType<TextBox>())
{   
    textbox.ContextMenu = new ContextMenu();
}
foreach(此.AllControlsOfType()中的var文本框)
{   
textbox.ContextMenu=新建ContextMenu();
}

请确保引用包含扩展方法的命名空间。

谢谢您的回复。我应该在哪里写这段代码。我是.net的初学者。我是在表单加载事件中编写的,但不起作用。这取决于您希望执行的操作,是否希望在加载表单时禁用它?或者在某个特定事件发生时?在初始化Component()之后在构造函数中工作正常否仍不工作。下面给出initializeComponent();我在另一个tabcontrol中有tabcontrol。初始化控件后,它在任何地方都可以正常工作。这段代码可能不起作用,因为它只适用于主窗体上的文本框。您应该从控件容器中选择控件,而不是从该容器中选择。控件感谢您的响应。我应该在哪里写这段代码。我是.net的初学者。我在表单加载事件中编写了它,但不起作用。我将tabcontrol放在一个tab控件中。VS向
AllControls
显示红色涂鸦错误:不存在。扩展方法将放在单独的静态类中。我将编辑我的答案。
foreach(var textbox in this.AllControlsOfType<TextBox>())
{   
    textbox.ContextMenu = new ContextMenu();
}