Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在整个项目中重用此代码段?_C#_Textbox_Extension Methods_Tabstop_Readonly Attribute - Fatal编程技术网

C# 如何在整个项目中重用此代码段?

C# 如何在整个项目中重用此代码段?,c#,textbox,extension-methods,tabstop,readonly-attribute,C#,Textbox,Extension Methods,Tabstop,Readonly Attribute,我的应用程序中的每个表单上都有此代码,这些表单都有文本框,以防止只读文本框被标记为: private void FrmInventory_Load(object sender, EventArgs e) { foreach (var txtbx in Controls.OfType<TextBox>()) { txtbx.TabStop = (!txtbx.ReadOnly); } } …然后这样称呼它: foreach (var txtbx

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

private void FrmInventory_Load(object sender, EventArgs e)
{
    foreach (var txtbx in Controls.OfType<TextBox>())
    {
        txtbx.TabStop = (!txtbx.ReadOnly);
    }
}
…然后这样称呼它:

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

这似乎没有多大价值——我仍然需要将大部分代码放在每种形式中,就像现在一样。创建一个既为只读又为TabStop=false的自定义文本框似乎有点过分了


有没有一种方法可以让包含表单的每个文本框都执行此逻辑,而不必在整个项目中重复代码?

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

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

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

将新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;
    }
 }

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

将新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;
    }
 }

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

扩展方法
公共静态部分类MyExtensions
{
公共静态void UpdateTabStop(此文本框txtBox)
{
txtBox.TabStop=!(txtBox.ReadOnly);
}
公共静态void UpdateTabStop(此表单为frm)
{
foreach(frm.Controls.OfType()中的var txtBox)
{
UpdateTabStop();
}
}
}

然后,在任何
表单上
都可以执行
这个.UpdateTabStop()
。。。当然,您应该在控件初始化后的事件中执行此操作,例如
Load

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

扩展方法
公共静态部分类MyExtensions
{
公共静态void UpdateTabStop(此文本框txtBox)
{
txtBox.TabStop=!(txtBox.ReadOnly);
}
公共静态void UpdateTabStop(此表单为frm)
{
foreach(frm.Controls.OfType()中的var txtBox)
{
UpdateTabStop();
}
}
}

然后,在任何
表单上
都可以执行
这个.UpdateTabStop()
。。。当然,您应该在控件初始化后的事件中执行此操作,例如
Load

这没有意义。只读字段允许用户在不更改值的情况下复制值。如果您不希望任何人能够聚焦该元素,可以将它的
Enabled
属性设置为
false
;我只是不想让它成为禁忌。当然,默认设置是,不要输入,但是如果你真的想输入,并且努力(点击),你可以。在我们的例子中,这是因为有些值是从数据库中填充的,用于信息目的,而不是编辑目的。。这就是您当前使用扩展方法的方式吗?只需将其用作实例方法。。i、 e.
TextBox.TextboxIsReadOnly()
@B.ClayShannon哇,这是我从未见过的东西,很高兴有人能帮助你!还有,当我看到“片段”这个词。。我想到一个预编译代码生成的“片段”。。您要寻找的术语是“可重用”或“代码重用”,因为您接受的解决方案是继承。这没有意义。只读字段允许用户在不更改值的情况下复制值。如果您不希望任何人能够聚焦该元素,可以将它的
Enabled
属性设置为
false
;我只是不想让它成为禁忌。当然,默认设置是,不要输入,但是如果你真的想输入,并且努力(点击),你可以。在我们的例子中,这是因为有些值是从数据库中填充的,用于信息目的,而不是编辑目的。。这就是您当前使用扩展方法的方式吗?只需将其用作实例方法。。i、 e.
TextBox.TextboxIsReadOnly()
@B.ClayShannon哇,这是我从未见过的东西,很高兴有人能帮助你!还有,当我看到“片段”这个词。。我想到一个预编译代码生成的“片段”。。您要寻找的术语是“可重用”或“代码重用”,因为您接受的解决方案是继承。
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();
       }
   }
}