查找上一个和下一个兄弟控件

时间:2010-09-10 14:43:01

标签: asp.net

有没有办法从代码隐藏中找到ASP.net表单中的上一个和下一个兄弟控件,类似于findControl()?

有时您不想为控件分配ID,因此您可以执行parent()。findControl(“ID”)以便找到它。当我所能做的就是previousControl()或其他东西(一个jQuery)时,我已经厌倦了提出ID。

在编写常规函数以解决几个具有相似布局且不想逐个解决它们的控件的情况下,这也很有用。

感谢您的任何建议。

2 个答案:

答案 0 :(得分:7)

对后人来说,这是我最后写的功能。效果很好(在实际项目中测试):

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

要像这样使用:

Control panel = textBox.PreviousControl();

并进行下一次控制:

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

此解决方案优于Atzoya的优势在于,首先,您不需要原始控件来获取ID,因为我根据实例进行搜索。其次,您必须知道ASP.net会生成多个Literal控件,以便在您的“真实”控件之间呈现静态HTML。这就是我跳过它们的原因,或者你会继续匹配垃圾。当然,这样做的缺点是,如果它是一个文字,你就找不到控件。这个限制在我的使用中不是问题。

答案 1 :(得分:1)

我认为没有像这样的内置函数,但是扩展Control类并向其添加方法非常容易:

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

当然需要在这里进行更多的处理(如果没有先前的控制或其他情况),但我认为你可以了解如何做到这一点。

编写此方法后,您可以将其称为

Control textBox1 = textBox2.PreviousControl();