Добавить Ajax CalendarExtender в динамическое текстовое поле в ASP.NET C #

Есть ли способ добавить Ajax CalendarExtender в динамический элемент управления текстовым полем ASP.NET? В основном я пытаюсь сделать следующее:

    protected void Page_Load(object sender, EventArgs e)
    {
        database.DB myDB = new database.DB();
        DataTable myVars = new DataTable();

        string myTopicID = (string)Session["myTopicID"];
        bool myInvite = (bool)Session["myInvite"];
        bool mySig = (bool)Session["mySig"];
        string myLogo = (string)Session["myLogo"];
        string myImage = (string)Session["myImage"];
        string myLanguage = (string)Session["myLanguage"];

        myVars = myDB.getVarFields(myTopicID, myLanguage);

        AjaxControlToolkit.CalendarExtender calenderDate = new AjaxControlToolkit.CalendarExtender();

        for (int i = 0; i < myVars.Rows.Count; i++)
        {
            Label label = new Label();
            TextBox text = new TextBox();
            label.Text = Convert.ToString(myVars.Rows[i]["varName"]);
            myPlaceHolder.Controls.Add(label);

            text.ID = Convert.ToString(myVars.Rows[i]["varName"]);

            myPlaceHolder.Controls.Add(new LiteralControl("&nbsp;"));

            myPlaceHolder.Controls.Add(text);

            if (Convert.ToString(myVars.Rows[i]["varName"]).Contains("Date:"))
            {
                calenderDate.TargetControlID = "ContentPlaceHolder1_" + text.ID; 
                myPlaceHolder.Controls.Add(calenderDate);
            }

            myPlaceHolder.Controls.Add(new LiteralControl("<br />"));
        }
    }

При запуске приведенного выше кода возникает следующая ошибка:

The TargetControlID of '' is not valid. A control with ID 'ContentPlaceHolder1_Date:' could not be found. 

Я полагаю, что это имеет смысл, поскольку фактического текстового поля еще не существует. Но есть ли способ обойти это?


person user2471103    schedule 11.06.2013    source источник


Ответы (1)


Я думаю, что ASP.NET будет достаточно умен, чтобы справиться с этим, если вы просто используете text.ID, вам не нужно добавлять префикс ContentPlaceHolder1_.

Если это не сработает, вы можете использовать свойство TextBox ClientIdMode, чтобы установить его как static, тогда text.ID определенно будет работать.

Следующий код работал у меня локально:

AjaxControlToolkit.CalendarExtender calenderDate = new AjaxControlToolkit.CalendarExtender();

            for (int i = 0; i < 2; i++)
            {
                Label label = new Label();
                TextBox text = new TextBox();
                label.Text = Convert.ToString("varName");
                ph1.Controls.Add(label);

                text.ID = "myId" + i;

                ph1.Controls.Add(new LiteralControl("&nbsp;"));

                ph1.Controls.Add(text);


                calenderDate.TargetControlID = text.ID;
                ph1.Controls.Add(calenderDate);


                ph1.Controls.Add(new LiteralControl("<br />"));
            }

Единственные различия, которые, я думаю, вы можете захотеть изучить: я использую последнюю версию ControlToolkit от Nuget, я использую ToolkitScriptManager вместо ScriptManager по умолчанию. Одна вещь, которая может быть важна для вас, - это сделать text.ID уникальным.

person Garrison Neely    schedule 11.06.2013
comment
Это по-прежнему вызывает ту же ошибку, в основном: TargetControlID из '' недействителен. Не удалось найти элемент управления с идентификатором Date :. - person user2471103; 11.06.2013
comment
Спасибо за помощь, Гарнизон. Я заставил его работать с помощью обычного ScriptManager. Моя проблема заключалась в том, что мне пришлось удалить: из идентификатора. Как только я это сделал, все заработало. Спасибо. - person user2471103; 12.06.2013
comment
Я знаю, что ему 18 месяцев, но это просто решило для меня проблему. Повышенный ответ - спасибо, Гаррисон! - person Dave Brown; 30.12.2015