1

複数のピクチャ ボックスとラベルを含むユーザー コントロールがあります。各ラベル (lb) を独自の Picturebox (pbParent) に配置する必要があり、このピクチャ ボックスの下の PictureBox 画像の可視性を向上させるために、ラベルの背景色を透明にする必要があります。ピクチャ ボックスには TabFrame0 から TabFrameN という名前が付けられ、ラベルには Label0 から LabelN という名前が付けられます。

名前で検索されたラベルを返さなければならないGetLabelByTag関数があります。Label の親を PictureBox にするまでは問題なく動作します (8 行目を参照)。だから、私の質問は次のとおりです:親が私のUserControlではなくpictureBoxになる場合、どのコレクションにラベルが含まれているかをどのように見つけるのですか?

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 に答える