0

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

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

将这段代码只放在一个地方会很好,但我该怎么做,因为每次调用“外部”方法时,它都会触及调用表单上的 TextBoxes,这闻起来有点腥。是一种扩展方法,例如:

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 的表单都执行此逻辑,而无需在整个项目中复制代码?

4

3 回答 3

2

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

于 2015-01-28T19:07:30.313 回答
1

您可以在每个表单中创建一个 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
{
}
于 2015-01-28T19:22:10.597 回答
1

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

扩展方法

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.

于 2015-01-28T20:04:30.450 回答