0

リピーターの RadioButtonList に RequiredFieldValidator を動的に追加しようとしていますが、次のエラーで失敗します。

Unable to find control id 'rblAccessory_40' referenced by the 'ControlToValidate' property of ''. 

このセクションのコードは次のとおりです。

            if ((e.Item.ItemType != ListItemType.Header) && (e.Item.ItemType != ListItemType.Footer))
        {

            Label lblAccID = (Label)e.Item.FindControl("lblAccID");
            RadioButtonList rblCondition = (RadioButtonList)e.Item.FindControl("rblCondition");

            rblCondition.ID = "rblAccessory_" + lblAccID.Text;


            if (conditionList.Count() > 0)
            {
                RequiredFieldValidator rfv = new RequiredFieldValidator();
                rfv.ControlToValidate = "rblAccessory_" + lblAccID.Text;
                rfv.ErrorMessage = "Please complete the accessories section";
                pnlValidation.Controls.Add(rfv);

                rblCondition.DataSource = conditionList;
                rblCondition.DataValueField = "id";
                rblCondition.DataBind();
            }
            foreach (ListItem li in rblCondition.Items)
            {
                li.Text = "";
                li.Value = "AccessoryID_" + lblAccID.Text + "-ConditionID_" + li.Value;
            }
        }
    }

この時点でデータが正しくバインドされているため、RadioButtonList (rblCondition) が確実に見つかります。

                rblCondition.DataSource = conditionList;
                rblCondition.DataValueField = "id";
                rblCondition.DataBind();

そのため、コントロール ID が見つからないというエラーが表示される理由がわかりません。

以下のように、コントロール ID を手動で指定しようとしました。

rfv.ControlToValidate = "rblAccessory_" + lblAccID.Text;

また、試しました:

rfv.ControlToValidate = rblCondition.ID;

lblAccID は、リピーターの行の ID を格納するために使用される非表示のテキスト フィールドです。

4

2 に答える 2

2
  1. イベント後にプロパティを検証するコントロールを割り当てますItemCreated。奇妙に聞こえるかもしれませんが、動的に作成されたコントロールへの参照をどのように取得しますか? 後で実行するList<Action>ために追加する参照への参照を保持することで、これを回避しました。ItemCreated

コントロール クラスで、List<Action>オブジェクトを宣言します。

List<Action> deferringControlToValidateUntilPreRender = new List<Action>();

イベント内にはItemCreated、次のような行があります。

deferringControlToValidateUntilPreRender.Add(() => rfv.ControlToValidate = rblCondition.UniqueID);

そして、後で、おそらく次のようになりPreRenderます。

foreach(var deferredAction in deferringControlToValidateUntilPreRender) action();

于 2013-06-26T20:53:15.860 に答える
0

はクライアント側のコードであるためRequiredFieldValidator、コントロールのクライアント ID を使用する必要があります。このような:

rfv.ControlToValidate = rblCondition.ClientID;

興味がある場合は、MSDN からさらに情報を入手してください。

Control.ClientIDMode プロパティ

また、ClientID と UniqueID の違いに関する SO の議論 (@MushinNoShin の回答で参照されているように、IMHO は正しくありません):

ClientID と UniqueID に違いがあるのはなぜですか?

于 2013-07-01T17:00:55.030 に答える