3

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'. 

わかりましたので、少し背景を説明します。コントロール コレクションに多数の「要素」を動的に追加する、このメイン コンポジット コントロールを取得しました。これらの要素の 1 つがこの '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 の両方で、同じエラーが発生します。私は何を間違っていますか?

4

2 に答える 2

7

ElementTextBoxの ClientIDプロパティではなく、IDを使用する必要があると思います。ClientID は、たとえば document.getElementyById などの Javascript で使用する必要があるページ固有の ID であり、サーバー側の ID とは異なります。特に、コントロールなどにマスターページやコントロールがある場合はそうです。

したがって、次のようになります。

ElementLabel.AssociatedControlID = ElementTextBox.ID;

お役に立てれば。

于 2008-10-22T06:55:23.367 に答える
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);
}
于 2008-11-15T17:30:22.247 に答える