当标签的父类是一个PictureBox时,在UserControl中按名称查找标签

本文关键字:标签 UserControl 查找 一个 父类 PictureBox | 更新日期: 2023-09-27 17:53:50

我有一个用户控件,上面有多个图片框和标签。我需要将每个标签(lb)放在他自己的Picturebox (pbParent)上,并且标签Backcolor必须是透明的,以提高这个图片框下的Picturebox图像可见性。图片框命名为TabFrame0 ~ TabFrameN,标签命名为Label0 ~ LabelN。

我有一个函数GetLabelByTag必须返回按其名称搜索的标签。它的工作很好,直到我使标签的父PictureBox(见第8行)。所以,我的问题是:我如何找到标签,如果它的父成为一个PictureBox,而不是我的UserControl,哪个集合包含它?

void CreateControls()
{
...
    newLabel.Name = TAB_PIC_BOX_LABEL_NAME + _id.ToString(); //1
    newLabel.Text = _text;//2
    newLabel.Tag = _id;//3
    newLabel.AutoSize = true;//4
    Controls.Add(newLabel);//5
    Label lb = GetLabelByTag(_id, TAB_PIC_BOX_LABEL_NAME);//6
    PictureBox pbParent = GetPicBoxByTag(_id, TAB_PIC_BOX_CONTROL_NAME);//7
    lb.Parent=pbParent;//8
    lb.BringToFront();//9
... 
}

Label GetLabelByTag(int _tag, string _family)
{
    Label rez = new Label();
    foreach (Control lb in Controls)
    {
        if (lb.Tag != null)
        {
            if (((int)lb.Tag == _tag) && (lb.Name == _family + _tag.ToString()))
            {
               rez = (Label)lb;
            }
        }
    }
    return rez;
}

当标签的父类是一个PictureBox时,在UserControl中按名称查找标签

您需要递归地迭代子元素的子元素(如果有的话)。例如:

Label GetLabelByTag(int _tag, string _family)
{
    return FindLabelByTag(_tag, _family, this);
}
Label FindLabelByTag(int _tag, string _family, Control _control)
{
    Label rez = null;
    foreach (Control lb in _control.Controls)
    {
        if (lb.Tag != null)
        {
            if (((int)lb.Tag == _tag) && (lb.Name == _family + _tag.ToString()))
            {
                return (Label)lb;
            }
        }
        var inControl = FindLabelByTag(_tag, _family, lb);
        if (inControl != null)
            return inControl;
    }
    return null;
}