Проблемы с обратной передачей RadioButtonList

Среда: ASP NET 2.0 - производственный сервер не имеет набора инструментов управления Ajax, поэтому здесь нет настоящего набора инструментов управления.

3 Список RadioButtons: Список один загружает, после обратной передачи элемент из первого списка используется для выбора значения Lab. После выбора лабораторного значения будет заполнен 3-й список переключателей. Есть несколько текстовых полей, но они не показаны в примере. Текстовые поля возвращают сами себя при изменениях. Если оба текстовых поля не пусты, для сеанса создается запись.

Теперь, если 3-й список переключателей изменен с значения по умолчанию, появится серия из 3 скрытых пользовательских элементов управления, которые представляют 3 уровня причин изменения (дочерние / родительские записи в базе данных).

Проблема, с которой я сталкиваюсь, заключается в том, что когда я выбираю другой элемент в списке радиокнопок, радиокнопка 3 OnSelectedIndex срабатывает после срабатывания моих пользовательских элементов управления. Моим пользовательским элементам управления требуется значение 3-го списка, чтобы перейти в базу данных и получить правильный набор записей, связанных с лабораторией.

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

Вот базовый HTML-код:

    <asp:RadioButtonList ID="rdoLab" runat="server" OnSelectedIndexChanged="rdoLab_OnSelectedIndexChange">
    </asp:RadioButtonList>
    <asp:TextBox ID="textbox1" runat="server" OnTextChanged="TextBoxProcess" />
    <asp:TextBox ID="textbox2" runat="server" OnTextChanged="TextBoxProcess" />
    <asp:RadioButtonList ID="rdoPrimary" RepeatColumns="3" OnSelectedIndexChanged="rdoPrimary_OnSelectedIndexChanged"  runat="server"  ToolTip="Select Normal, Hypo or Hyper - Normal is default value." AutoPostBack="True" >
        <asp:ListItem Value="3" Text="Normal" Selected="true"/>
        <asp:ListItem Value="1" Text="Hypo" />                                
        <asp:ListItem Value="2" Text="Hyper" />
    </asp:RadioButtonList>
     <asp:Panel ID="UpdLab" runat="server" Visible="true"  EnableViewState="true">
            <asp:Table ID="tblAdmin" runat="server">
                <asp:TableRow>
                      <asp:TableCell runat="server" id="tblCell1" Visible="false" CssClass="tdCell"  VerticalAlign="top"> 
                            <uc1:Lab ID="Lab1" runat="server" EnableViewState="true" EnableTheming="true" />                                            
                      </asp:TableCell>
                      <asp:TableCell runat="server" ID="tblCell2" Visible="false"  CssClass="tdCell" VerticalAlign="top">
                            <uc1:Lab ID="Lab2" runat="server" EnableViewState="true" EnableTheming="true" />
                       </asp:TableCell>
                       <asp:TableCell runat="server" ID="tblCell3" Visible="false"   CssClass="tdCell" VerticalAlign="top">
                            <uc1:Lab ID="Lab3" runat="server" EnableViewState="true" EnableTheming="true" />
                       </asp:TableCell>
                </asp:TableRow>
            </asp:Table>

    </asp:Panel>                            

Вот страница позади:

protected override void OnPreLoad(EventArgs e)
    {
        base.OnPreLoad(e);
        GetSessionVars();

        if (CommonUI.strTest((string)Session["rdoLabs"]) && CommonUI.strTest((string)Session["rdoPrimary"]) && Convert.ToString(hrdoLabs.Value) == (string)Session["rdoLabs"])
        {
            divLabLvl.Visible = true;
            // Get cboListItems from the web user controls...
            Session["ArrLstItems"] = "";
            ArrayList ArrLstItems = new ArrayList();
            ArrayList GetWuc = GetWUCS();

            for (int i = 0; i < GetWuc.Count; i++)
            {
                Lab wuc = (Lab)GetWuc[i];
                CheckBoxList cboItemList = (CheckBoxList)wuc.FindControl("cboItems");
                string cboItems = GetCboItemList(cboItemList);
                HiddenField hcboItems = (HiddenField)wuc.FindControl("hcboItems");
            }
            Session["ArrLstItems"] = (ArrayList)ArrLstItems;
        }

    } 
    protected void Page_Load(object sender, EventArgs e)
    {

        if (!IsPostBack)
        {
            DbDataReader ddrGrp = rdoGroups();
            if (ddrGrp.HasRows)
            {
                rdoGroup.DataSource = ddrGrp;
                rdoGroup.DataBind();
            }
            ddrGrp.Close();
        }
        else
        {
            DbDataReader ddrLab = rdoUserLabs();
            if (ddrLab.HasRows)
            {
                rdoLabs.DataSource = ddrLab;
                rdoLabs.DataBind();
                if (CommonUI.strTest((string)Session["rdoLabs"]))
                {
                    if (Convert.ToInt32(Session["rdoLabs"]) > 0)
                    {
                        rdoLabs.SelectedValue = (string)Session["rdoLabs"];
                        SetLabCss();
                    }
                }
            }
            ddrLab.Close();
        }

    }

    protected void rdoGroup_OnSelectedIndexChanged(object sender, EventArgs e)
    {
        //...do some stuff
    }

    protected void rdoLabs_OnSelectedIndexChanged(object sender, EventArgs e)
    {
        //... reload 
    }

    protected DbDataReader rdoGroups()
    {

        int group_type_id = GroupTypeId();
        Group grp = new Group();
        return grp.GetGroups(group_type_id);

    }

    protected DbDataReader rdoUserLabs()
    {
        RadioButtonList rdoGrp = (RadioButtonList)CommonUI.FindCtrlRecursive(this.Master, "rdoGroup");
        int GroupId = Convert.ToInt32(rdoGrp.SelectedValue);
        LabAbnormalReasons lar = new LabAbnormalReasons();
        return lar.GetLabsList(GroupId);
    }

    protected void rdoPrimary_OnSelectedIndexChanged(object sender, EventArgs e)
    {
        Session["Save"] = ((RadioButtonList)sender).ID;
        RadioButtonList rdoGroups = (RadioButtonList)CommonUI.FindCtrlRecursive(this.Master, "rdoGroup");
        RadioButtonList rdoLabs = (RadioButtonList)CommonUI.FindCtrlRecursive(this.Master, "rdoLabs");
        int UserId = Convert.ToInt32(Session["UserId"]);
        int DocId = Convert.ToInt32(Session["DocId"]);
        SubmitLab_Data(arrLstItems, arrOthers);
    }

    protected void GetSessionVars()
    {

        RadioButtonList rdoGroup = (RadioButtonList)CommonUI.FindCtrlRecursive(this.Master, "rdoGroup");
        RadioButtonList rdoPrimary = (RadioButtonList)CommonUI.FindCtrlRecursive(this.Master, "rdoPrimary");
        RadioButtonList rdoLabs = (RadioButtonList)CommonUI.FindCtrlRecursive(this.Master, "rdoLabs");

        if (rdoGroup.SelectedIndex != -1)
        {
            Session["rdoGroup"] = (string)rdoGroup.SelectedValue;
        }
        if (rdoLabs.SelectedIndex != -1)
        {
            Session["rdoLabs"] = (string)rdoLabs.SelectedValue;
        }
        if (rdoPrimary.SelectedIndex != -1)
        {
            Session["rdoPrimary"] = (string)rdoPrimary.SelectedValue;

        }

    }

Вот пример кода пользователя:

ЭТОТ КОД НИКОГДА НЕ ЗАПУСКАЕТСЯ, ПОТОМУ ЧТО данные 3-го списка кнопок здесь недоступны:

protected void Page_Load(object sender, EventArgs e)
    {
        /////*
        //// *  lab & Primary have been selected... 
        //// */
        int lvl = SetLvlId();
        int par_id = GetParentLvl();
        Lab wuc = GetWuc(lvl);
        if (wuc != null)
        {
            if (CommonUI.strTest(Convert.ToString(Session["rdoLabs"])) && CommonUI.strTest(Convert.ToString(Session["rdoPrimary"]))) 
            { 
                    // data in data base for this user, lab, doc identifier...
                    if (Convert.ToInt32(Session["rdoPrimary"]) > 0
                     {
                        // have user hdr data - see if item data is mapped...
                       // do some stuff here
                    }

            } 
        }
    }

Надеюсь, это понятно. Я атт

--- * --- С момента первоначальной публикации: добавлена ​​простая функция javascript / OnDataBound Primary (object) {alert ("Value Clicked:" + object); }


protected void rdoPrimary_DataBound (отправитель объекта, EventArgs e) {RadioButtonList rdlPrimary = (RadioButtonList) отправитель; foreach (ListItem li в rdlPrimary.Items) {li.Attributes.Add ("onclick", "javascript: Primary ('" + li.Value + "')"); }}


person eric    schedule 27.01.2011    source источник
comment
Вы пытались выполнить обработку в событиях PreInit или Page_Init, чтобы увидеть, является ли поведение таким же или другим?   -  person TheGeekYouNeed    schedule 28.01.2011


Ответы (1)


Сохраните и извлеките значения, которые вы хотите сохранить в методах SaveViewState и LoadViewState, и посмотрите, сработает ли это для вас? Также обратите внимание на более ранние и последующие события жизненного цикла для обработки логики - Init и OnPreRender. Это работало для меня в прошлом.

person IrishChieftain    schedule 27.01.2011
comment
Я попытался добавить переопределение для LoadViewState. Ничего из того, что я помещаю в этот раздел, не попадает даже во время отладки. Я попытался добавить код, чтобы получить один конкретный пользовательский элемент управления и выбранное значение. Затем я отключил все точки останова в программе. Затем я добавил точку останова на этом наборе строк кода. Когда я просматриваю код, ничего не срабатывает? - person eric; 28.01.2011
comment
Моя интуиция такова, что это слишком сложно. Попробуйте разбить его на что-нибудь попроще ... создавайте поэтапно, возможно, используя вместо этого каскадные раскрывающиеся списки. - person IrishChieftain; 28.01.2011
comment
Вы сохранили выбор пользователя ViewState для начала? - person IrishChieftain; 28.01.2011
comment
У меня есть два текстовых поля с данными и третий элемент управления. Это представляет собой запись заголовка. Третий элемент управления имеет 3 атрибута: - person eric; 28.01.2011
comment
Проблема заключается в третьей кнопке, которая обновляет запись заголовка пользователя и должна управлять логикой для отображения пользовательских элементов управления и управления тем, что отображают пользовательские элементы управления. Когда я изменяю этот третий список радиокнопок, он запускает обновления правильно, но загрузка страницы элементов управления происходит до того, как я смогу получить значение изменения элемента управления. Я пробовал управлять выгрузкой, чтобы сохранить значение в скрытом поле, но, похоже, это не сработало. Я мог бы использовать скрытое поле для управления этой логикой, если бы мог сделать это при разгрузке. Но вроде выгрузка видит начальное значение? - person eric; 28.01.2011
comment
Обычно я решаю этот тип проблем, перемещая вещи в Init и / или PreRender. RBL не придерживаются своих ценностей, поэтому вы пытаетесь справиться с этим в дополнение к проблемам жизненного цикла. Я бы переосмыслил пользовательский интерфейс и попытался упростить его. - person IrishChieftain; 29.01.2011
comment
Что я перехожу на инициализацию или предварительную визуализацию? - person eric; 29.01.2011
comment
Думаю, я здесь борюсь, потому что, что бы я ни делал, пользовательский интерфейс логики связан с изменением индекса в 3-м списке радиообъявлений. Зная, что в жизненном цикле, который не обрабатывается до момента загрузки, мне сложно понять, где я могу зафиксировать изменение в элементе управления. - person eric; 29.01.2011
comment
Это просто еще одна обратная передача, и я думаю, что это выполнимо, но я бы предпочел фильтровать с помощью DDL. Если вам нужно что-то пораньше, поместите это в Init или PreInit ... если вам нужно применить логику поздно, поместите это в PreRender. При разумном использовании ViewState вы сможете это сделать. - person IrishChieftain; 29.01.2011
comment
Начните снова с каскадных DDL (всего два для начала) и перед добавлением третьего задайте себе вопрос: что, если они передумают и сделают другой выбор в последнем DDL ;-) bit.ly/hqJFCp - person IrishChieftain; 30.01.2011
comment
На сайтах «Купить машину» вы часто увидите это, как правило, сделанное плохо. Мое личное правило - позволить пользователю делать выбор только на последнем появившемся элементе управления. Я не решаюсь помочь вам сделать это плохо - начните снова с пользовательского интерфейса и базового удобства использования, как если бы вы его использовали. Нам, программистам, неприятно это слышать, но ... - person IrishChieftain; 30.01.2011
comment
Я продумал этот макет. Я понимаю пользователей. Пользователи выбирают группу, в которой они участвуют. Проверить. Пользователи выбирают любую подходящую лабораторию, которую им нужно заполнить для терпения. Проверять. Пользователи вводят значения, которые представляют нормальное состояние и значения пациента. Если значение пациента выходит за пределы нормального диапазона, выше или ниже, они выбирают Hyper / Hypo в 3-й кнопке. После выбора Hyper / Hypo я хочу, чтобы пользовательский элемент управления отображал и запускал свой список элементов. - person eric; 04.02.2011
comment
Я почти уверен, что макет пользовательского интерфейса правильный. Студент выбирает группу, в которой он находится. Студент выбирает лабораторную работу. Учащийся вводит два текстовых значения, а затем решает, что третий вариант - это значения нормальные, высокие или низкие (гипер / гипо). Этот третий вариант должен отображать список вопросов; однако эти вопросы связаны с выбором 3-го пункта. Они не могут даже узнать этот третий элемент, если не посмотрят на два введенных значения. Таким образом, этот элемент управления должен быть последним элементом управления на странице перед выбором. - person eric; 04.02.2011