Search code examples
c#textboxextension-methodstabstopreadonly-attribute

How can I reuse this snippet throughout a project?


I have this code on each form in my app that has textboxes to prevent the textboxes that are ReadOnly from being tabbed to:

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

It would be good to only have this code in one place, but how can I do that, as each time that "external" method was called, it would touch TextBoxes on the calling form, which smells a little fishy. Is an extension method the way to go, something like:

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

...and then call it like this:

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

?

That doesn't seem like it's of much value - I still would have to put most of the code in each form, just as things stand now. Creating a custom textbox that is both ReadOnly and TabStop = false seems a little overkillish...

Is there a way to have this logic execute for every TextBox-containing form, without reproducing the code all throughout the project?


Solution

  • You can create a baseForm and Inherit that form in each of your forms.

    Add a new Windows Form to your project(baseForm) and create load event

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

    And finally in each form you can do like this

    public partial class FrmInventory : baseForm
    {
    }