在标签上设置AssociatedControlID失败

时间:2008-10-22 06:27:11

标签: asp.net composite-controls

我有一个复合控件,可以将TextBox和Label控件添加到其Controls集合中。当我尝试将Label的AssociatedControlID设置为Textbox的ClientID时,我收到此错误

Unable to find control with id 
'ctl00_MainContentPlaceholder_MatrixSetControl_mec50_tb'
that is associated with the Label 'lb'. 

好的,有点背景。我得到了这个主复合控件,它动态地向控件集合添加了许多“元素”。其中一个元素恰好是“MatrixTextBox”,它是由TextBox和Label组成的控件。

我将Label和TextBox保存为受保护的类变量,并在CreateChildControls中初始化它们:

    ElementTextBox = new TextBox();
    ElementTextBox.ID = "tb";
    Controls.Add(ElementTextBox);

    ElementLabel = new Label();
    ElementLabel.ID = "lb";
    Controls.Add(ElementLabel);

我尝试设置

ElementLabel.AssociatedControlID = ElementTextBox.ClientID;

将控件添加到Controls集合后,甚至在PreRender中都会产生相同的错误。我做错了什么?

2 个答案:

答案 0 :(得分:7)

我认为您不得使用ElementTextBox的ClientID 属性,而应使用 ID 。 ClientID是您必须在Javascript中使用的页面唯一ID,例如在document.getElementyById中,并且与服务器端ID不同 - 特别是如果您在控件中有主页和/或控件等。

所以它应该是:

ElementLabel.AssociatedControlID = ElementTextBox.ID;

希望这有帮助。

答案 1 :(得分:3)

对遇到错误的其他读者可能有帮助:

请注意,如果您在运行时将标签与输入控件关联,而未先显式设置输入控件的ID,则设置AssociatedControlID也会失败。如果您要动态创建多个带有标签的文本框,复选框或单选按钮,则需要注意这个问题。

private void AddRadioButton(PlaceHolder placeholder, string groupname, string text)
{
    RadioButton radio = new RadioButton();
    radio.GroupName = groupname;
    radio.ID = Guid.NewGuid().ToString(); // Always set an ID.

    Label label = new Label();
    label.Text = text;
    label.AssociatedControlID = radio.ID;

    placeholder.Controls.Add(radio);
    placeholder.Controls.Add(label);
}