当标签的Parent是PictureBox时,在UserControl中按名称查找标签

时间:2013-01-16 14:58:45

标签: c# user-controls transparency parent-child

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

我有一个函数 GetLabelByTag ,它必须返回按名称搜索的标签。它工作正常,直到我将Label的父级设为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;
}

1 个答案:

答案 0 :(得分:1)

如果有的话,你需要递归地迭代孩子的孩子。例如。像这样:

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