1

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

我有一个函数GetLabelByTag必须返回按其名称搜索的标签。在我将 Label 的父级设置为 PictureBox 之前,它工作正常(见第 8 行)。所以,我的问题是:如果它的父级变成图片框,而不是我的 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;
}
4

1 回答 1

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;
}
于 2013-01-16T15:18:40.490 回答