【问题标题】:How can I reuse this snippet throughout a project?如何在整个项目中重用此代码段?
【发布时间】:2015-01-30 04:44:07
【问题描述】:

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

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

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

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

【问题讨论】:

  • 这没有意义。只读字段允许某人复制值而不更改它。如果您不希望任何人能够关注该元素,请将其 Enabled 属性设置为 false
  • 我并不是说我不希望它们成为焦点;我只是不希望它被标签。 IOW,默认是,不输入,但如果你真的想并且努力(你点进去),你可以。在我们的例子中,这是因为从数据库中填充了一些值,用于信息而非编辑目的。
  • hmm.. 这是您目前使用扩展方法的方式吗?只需将其用作实例方法..即TextBox.TextboxIsReadOnly()
  • @B.ClayShannon 哇,这是我从未见过的东西,很高兴有人能帮助你!
  • 另外,当我看到“sn-p”这个词时,我想到了预编译代码生成“sn-p”。 msdn.microsoft.com/en-us/library/ms165392.aspx .. 您正在寻找的术语是“可重用”或“代码重用”,因为您接受的解决方案是继承。

标签: c# textbox extension-methods tabstop readonly-attribute


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以在每个表单中创建一个 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
    {
    }
    

    【讨论】:

      【解决方案3】:

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

      扩展方法

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-07
        • 2022-11-21
        • 2016-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-20
        • 1970-01-01
        相关资源
        最近更新 更多