Получить значения из динамических элементов управления с помощью C #? - PullRequest
0 голосов
/ 04 декабря 2011

Я создал несколько элементов управления radiobuttonlist в своем проекте, они создаются каждый раз при загрузке страницы, я хочу получить значение радио кнопки, которую выбрал пользователь, но так как мои кнопки радио были созданы динамически, я не не знает, как получить доступ к их значениям или как создать обработчики событий. Есть ли способ присвоить имя или идентификатор элемента управления при его создании? Я надеюсь, что вы можете мне помочь.

Я создаю серию radiobuttlist для события page_load с текстом и их значениями, извлеченными из базы данных. Теперь пользователь должен выбрать один из вариантов из этого списка переключателей, и я хочу получить значение переключателя, который проверял пользователь. Как мне это сделать, если я не знаю ни имени, ни идентификатора radiobuttlist, поскольку они создаются динамически. вот что у меня есть:

for (int i = 3; i < numfields; i++) {
            if (dr[i].ToString() != "" && dr[i] != null){
                r.Items.Add(new ListItem(dr[i].ToString(), dr[i].ToString()));
                //r.SelectedIndexChanged += new EventHandler(rowSelectedIndex);
            }
        }

так что в основном я использую мой datareader для циклического прохождения данных в базе данных, если значение из поля не пустое или нулевое, то я добавляю элемент в radiobuttlist под названием "r" я тоже пытался создать обработчик событий, но так как я никогда не работал с ними, я действительно не знаю, что делать. :( Мне очень жаль, если я выгляжу слишком жалким.

Ответы [ 4 ]

1 голос
/ 04 декабря 2011

Быстрый просмотр вашего кода:

for (int i = 3; i < numfields; i++) { 
            if (dr[i].ToString() != "" && dr[i] != null){ 
                r.Items.Add(new ListItem(dr[i].ToString(), dr[i].ToString())); 
                //r.SelectedIndexChanged += new EventHandler(rowSelectedIndex); 
            } 
        } 

Самая очевидная вещь, которая выпадает, - это ваше заявление if. Вы должны сначала проверить на ноль:

if (dr[i] != null && dr[i].ToString() != ""){

Как будто dr [i] имеет значение null, вы получите исключение (поскольку вы будете пытаться вызвать метод ToString () для нулевого объекта.

Если содержимое dr всегда будет строкой, вы можете написать:

if(!String.IsNullOrEmpty(dr[i]){

Я также отмечаю, что вы начинаете индексирование с 3 - это потому, что вы хотите пропустить первые 3 поля?

Где бы вы ни создавали свою переменную, 'r' , вы можете установить свойства name и ID. Вы можете использовать свойство ID для поиска элемента управления в PostBack. Итак, если вы создали свой радиолист так:

RadioButtonList r = new RadioButtonList();
r.Id = "MyRadioButtonList";
r.SelectedIndexChanged += MyRadioButton_SelectedIndexChanged;

Который будет указывать на следующий обработчик события:

private void MyRadioButton_SelectedIndexChanged(Object sender, EventArgs e) {

    ... Do Stuff ...    

}

Есть несколько способов найти свой контроль, когда вы отправляете обратно; вы можете найти в коллекции Request.Forms элемент управления, совпадающий с именем отправленного вами элемента управления, или, что более уместно, вы можете использовать метод FindControl с идентификатором, который вы дали элементу управления. См. C #, FindControl для публикации с методом (Джефф Этвуд!), Который будет искать всю иерархию элементов управления для вашего элемента управления.

При добавлении динамического элемента управления тоже важно. Если вы добавите его слишком поздно в жизненном цикле страницы, он не будет доступен в PostBack. См. http://support.microsoft.com/kb/317515 для более подробной информации о , когда добавить элемент управления. Существует множество ресурсов для динамических элементов управления ASP.Net.

1 голос
/ 04 декабря 2011

Вы можете поместить свой RadioButton в список, как вы их создаете. Это также, когда вы хотите добавить свои обработчики.

RadioButton rb;
for (int i = 1; i < 5; i++)
{
    rb = new RadioButton();

    rb.AutoSize = true;
    rb.Location = new System.Drawing.Point(25, (i*25) + 25);
    rb.Name = "radioButton" + i.ToString();
    rb.Text = "radioButton" + i.ToString();
    //Add some event handler?
    this.Controls.Add(rb);
    lstRadioButton.Add(rb);
}

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

foreach (RadioButton rButton in lstRadioButton)
{
    if (rButton.Checked == true)
    {
        //Do something
    }
}
0 голосов
/ 04 декабря 2011

Проблема в том, что вы создаете элементы управления в page_load.Чтобы их значения были правильно отправлены обратно в элементы управления, необходимо переместить это создание в метод page_init и заново создавать их каждый раз.

Затем в page_load вы можете получить доступ к значениям в элементах управления правильно.Если вы дадите им идентификаторы, используя согласованное соглашение об именах, вы сможете найти их с помощью метода FindControl или, в page_init, вы можете сохранить их в коллекции на уровне страницы или пользовательского контроля.

0 голосов
/ 04 декабря 2011

Возможно, вы ищете TagName свойство, если вам недостаточно программного имени.

...