我怎样才能在整个项目中重用这个片段?

How can I reuse this snippet throughout a project?

我在我的应用程序中的每个表单上都有此代码,这些表单具有文本框以防止只读的文本框被标记为:

private void FrmInventory_Load(object sender, EventArgs e)
{
    foreach (var txtbx in Controls.OfType<TextBox>())
    {
        txtbx.TabStop = (!txtbx.ReadOnly);
    }
}

最好只将此代码放在一个地方,但我该怎么做,因为每次调用 "external" 方法时,它都会触及调用表单上的文本框,闻起来像有点腥。是一种扩展方法,例如:

public static bool TextboxIsReadOnly(this TextBox txtbx)
{
    return txtbx.ReadOnly;
}

...然后这样称呼它:

foreach (var txtbx in Controls.OfType<TextBox>())
{
    txtbx.TabStop = TextboxIsReadOnly(txtbx);
}

?

这似乎没有多大价值 - 我仍然必须将大部分代码放入每个表单中,就像现在的情况一样。创建一个 ReadOnly 和 TabStop = false 的自定义文本框似乎有点矫枉过正...

有没有办法让每个包含 TextBox 的表单都执行此逻辑,而无需在整个项目中重新生成代码?

拥有一个执行该步骤的基础 class 并使其成为所有表单的基础是可行的,尽管您需要小心调用重载方法的基础版本。

您可以创建一个 baseForm 并在每个表单中继承该表单。

将新的 Windows 表单添加到您的项目 (baseForm) 并创建加载事件

 public class baseForm: Form
 {
    public baseForm()
    {
        this.Load += baseForm_Load;
    }

    void baseForm_Load(object sender, EventArgs e)
    {
      var t = GetAll<TextBoxX>(this);
      foreach (var txtbx in Controls.OfType<TextBox>())
      {
           txtbx.TabStop = (!txtbx.ReadOnly);
      }
     }

    public static List<T> GetAll<T>(Form f1)
    {
        List<T> f = new List<T>();
        try {
            if (f1 != null) {
                CheckInner<T>(f1.Controls, ref f);
            }
        } catch (Exception ex) {
            f.Clear();
        }

        return f;
    }
 }

最后在每个表单中你都可以这样做

public partial class FrmInventory : baseForm
{
}

只是详细说明您所暗示的扩展方法解决方案。

扩展方法

public static partial class MyExtensions
{
   public static void UpdateTabStop(this TextBox txtBox)
   {
       txtBox.TabStop = !(txtBox.ReadOnly);
   }
   public static void UpdateTabStop(this Form frm)
   {
       foreach (var txtBox in frm.Controls.OfType<TextBox>())
       {
           txtBox.UpdateTabStop();
       }
   }
}

然后,在任何 Form 上你会做 this.UpdateTabStop()...你当然应该在控件初始化后的事件中这样做,比如 Load.