Проблема с динамически созданным элементом управления C#

StackOverflow https://stackoverflow.com/questions/1488606

  •  18-09-2019
  •  | 
  •  

Вопрос

у меня возникли проблемы с получением значений из динамически создаваемого раскрывающегося списка.все элементы управления создаются в разделе Page_Init.элементы списка добавляются в это время также из массива элементов списка.(элементы управления называются одинаково, поэтому они должны быть доступны в состоянии просмотра для соответствующих настроек.)

вот функция, которая пытается получить значения:

protected void Eng98AssignmentComplete_Click(object sender, EventArgs e)
{
    String myID = "0";
    Page page = Page;
    Control postbackControlInstance = null;
    // handle the Button control postbacks
    for (int i = 0; i < page.Request.Form.Keys.Count; i++)
    {
        postbackControlInstance = page.FindControl(page.Request.Form.Keys[i]);
        //Response.Write(page.Request.Form.Keys[i].ToString());
        if (postbackControlInstance is System.Web.UI.WebControls.Button)
        {
            myID = Convert.ToString(
                postbackControlInstance.ID.Replace("button_", ""));
        }
    }
    String txtholder = "ctl00$ContentPlaceHolder$Eng098Instructors_" + myID;
    Response.Write("MYID: " + myID + "<br/>");
    DropDownList ddInstructorCheck = (DropDownList)Page.FindControl(txtholder);
    Response.Write("Instructor Selected: "
      + ddInstructorCheck.SelectedValue + "<br/>");
}

вот результат, который я получаю, независимо от того, какой инструктор был выбран.....

MYID: 1_1
Instructor Selected: 0
ctl00$ContentPlaceHolder$Eng098Instructors_1_1

имя элемента управления правильное (проверено через источник представления)....

идеи?

Это было полезно?

Решение 8

у меня было 2 улова....вот какие они были.

1.  I didn't clear the table I was adding to before re-creating the controls.

очевидно, вчера мое внимание к деталям было отключено, я почти уверен, что лидером ctlXX элемента управления при обратной передаче было какое-то другое число из-за того, как я воссоздавал элементы управления.

2.  I was assigning the same list to all the dropdownlist controls.  

как только я назвал поиск при каждом создании элементом управления раскрывающимся списком, все работает хорошо.

в любом случае чего бы это ни стоило....

Другие советы

Вам придется приложить немало усилий, чтобы построить эту причудливую строку:

ctl00$ContentPlaceHolder$Eng098Instructors_1_1

Это ID клиента вашего контроля, а не идентификатора сервера.Этот код выполняется на стороне сервера, поэтому вам нужен идентификатор сервера.Чтобы получить этот контроль с использованием идентификатора сервера, вам нужно сделать следующее:

ContentPlaceHolder.FindControl("Eng08Instructors_1_1");

Обратите внимание, что я не просматривал страницу, потому что ваш заполнитель содержимого создал новый контейнер именования.

Кроме того, способ настройки вашего цикла myID переменная будет всегда в конечном итоге удерживаю последний Кнопка в коллекции «Ключи».Зачем вообще беспокоиться о цикле?


Судя по вашим комментариям, лучший способ найти идентификатор раскрывающегося списка выглядит следующим образом:

string id = ((Control)sender).ID.Replace("button_", "Eng098Instructors_");

почему бы просто не сохранить элемент управления в экземпляре своего класса, чтобы не использовать FindControl?

Вы также воссоздаете элементы управления во время обратной передачи?Динамически создаваемые/добавленные элементы управления должны создаваться заново при каждом запросе, они не создаются заново автоматически.

Почему бы вам не указать отправителя?Это должна быть кнопка, вызвавшая обратную передачу:

string myId = "0";
Button btn = sender as Button;
if (btn != null)
    myId = btn.ID
...

Вам необходимо выполнить что-то подобное, потому что свойство UniqueID является ключом в Request.Form.

        List<Button> buttons = new List<Button>();
        List<DropDownList> dropdowns = new List<DropDownList>();
        foreach (Control c in Controls)
        {
            Button b = (c as Button);
            if (b != null)
            {
                buttons.Add(b);
            }

            DropDownList d = (c as DropDownList);
            if (d != null)
            {
                dropdowns.Add(d);
            }
        }

        foreach (String key in Request.Form.Keys)
        {
            foreach (Button b in buttons)
            {
                if (b.UniqueID == key)
                {
                    String id = b.ID.Replace("button_", "");
                    String unique_id = "ctl00$ContentPlaceHolder$Eng098Instructors_" + id;
                    Response.Write("MYID: " + id + "<br/>");

                    foreach (DropDownList d in dropdowns)
                    {
                        if (d.UniqueID == unique_id)
                        {
                            Response.Write("Instructor Selected: " + d.SelectedValue + "<br/>");
                            break;
                        }
                    } 
                }
            }   
        }

Я не уверен, почему вы генерируете элемент управления в коде (если вы это делаете, вы все равно можете добавлять элементы динамически), но код, который генерирует элементы управления, вероятно, будет здесь огромным подспорьем.Я предполагаю, что вы не устанавливаете значение элемента списка, а просто устанавливаете текст элемента списка.Попробуйте посмотреть, что вы получаете из поля SelectedText, и опубликуйте свою функцию создания элемента управления.

РЕДАКТИРОВАТЬ:В ответ на ваш комментарий к сообщению @Martin вы сказали: «Да, я воссоздаю элементы управления в функции Page_Init каждый раз, когда создается страница (начальная или обратная передача)».Вы также устанавливаете выбранное значение при их создании?

Вы также можете использовать элементы управления на странице, даже если ваши данные поступают из базы данных, сами элементы управления не должны создаваться динамически.

Как насчет этого?

((Button)sender).Parent.FindControl(myid)

Изменить: Я неправильно понял ваш вопрос.Но я думаю, вам следует следить за жизненным циклом страницы.это обычная проблема для динамически создаваемых элементов управления.

Я провел небольшое исследование и вот некоторая информация о Динамически создаваемые элементы управления может помочь вам...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top