我有一个复合控件,可以将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中都会产生相同的错误。我做错了什么?
答案 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);
}