RadioButtonList Проблемы с обратной связью - PullRequest
1 голос
/ 28 января 2011

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

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

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

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

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

Вот основной код 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 (объект) { alert («Значение кликнуло:» + объект); }


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

1 Ответ

0 голосов
/ 28 января 2011

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

...