Finding the previous and next sibling controls

前端 未结 2 1289

Is there a way to find the previous and next sibling controls in an ASP.net form from code-behind, similar to findControl()?

Sometimes you don\'t want to assign an I

相关标签:
2条回答
  • 2021-01-13 12:52

    For posterity, here is the function I ended up writing. Works very well (tested in a real project):

        public static Control PreviousControl(this Control control)
        {
            ControlCollection siblings = control.Parent.Controls;
            for (int i = siblings.IndexOf(control) - 1; i >= 0; i--)
            {
                if (siblings[i].GetType() != typeof(LiteralControl) && siblings[i].GetType().BaseType != typeof(LiteralControl))
                {
                    return siblings[i];
                }
            }
            return null;
        }
    

    To be used like this:

    Control panel = textBox.PreviousControl();
    

    and for next control:

        public static Control NextControl(this Control control)
        {
            ControlCollection siblings = control.Parent.Controls;
            for (int i = siblings.IndexOf(control) + 1; i < siblings.Count; i++)
            {
                if (siblings[i].GetType() != typeof(LiteralControl) && siblings[i].GetType().BaseType != typeof(LiteralControl))
                {
                    return siblings[i];
                }
            }
            return null;
        }
    

    The advantage of this solution over that of Atzoya is that, first, you don't need the original control to have an ID since I do the search based on instance. Second, you have to know that ASP.net generates several Literal controls in order to render your static HTML in between your "real" controls. That's why I skip them, or you will keep matching junk. Of course the downside of this is you can't find a control if it's a Literal. This limitation was not a problem in my use.

    0 讨论(0)
  • 2021-01-13 13:08

    I don't think there is a built in function like that, but it is very easy to extend the Control class and add methods to it like so:

    public static Control PreviousControl(this Control control)  
    {
       for(int i=0; i<= control.Parent.Controls.Count; i++)
          if(control.Parent.Controls[i].Id == control.Id)
             return control.Parent.Controls[i-1];
    }
    

    Of course a bit more handling needs to be done here (if there is no previous control or other scenarios) but i think you get the picture of how this could be done.

    After writing this method you can call it like

    Control textBox1 = textBox2.PreviousControl();
    
    0 讨论(0)
提交回复
热议问题