2011-01-27 6 views
1

環境:ASP NET 2.0 - Production ServerにはAjax Control Toolkitがないため、ここで実際に使用するコントロールツールキットはありません。RadioButtonListポストバックの問題

3 RadioButtonsリスト: リスト1がロードされ、ポストバック後、リスト1の項目がLab値を選択するために使用されます。 ラボの値が選択されると、3番目のラジオボタンリストが入力されます。いくつかのテキストボックスがありますが、例には表示されていません。テキストボックスは変更時にポストバックします。両方のテキストボックスが でない場合、セッションのレコードが作成されます。

3番目のラジオボタンリストをデフォルトから変更すると、変更の3つのレベル(データベースの子/親レコード)を表す一連の3つの非表示のユーザーコントロールが表示されます。

私が抱えている問題は、ラジオボタンリストの別の項目を選択したときです。ラジオボタン3 OnSelectedIndexがユーザーコントロールの発射後に発砲しています。私のユーザーコントロールは、データベースに行き、ラボに関連した正しいレコードセットを得るために、3番目のリストの値を必要とします。

問題は、Webコントロールがロードされるまで最後のラジオボタンリストが処理されないため、ユーザーコントロールをマウントするコードが決して実行されないためです。ここで

は、基本的な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 
        } 

      } 
     } 
    } 

これは明らかです。私は、元の投稿以来---

--- * ATTました: は(オブジェクト) { アラートが( "値をクリック:" +オブジェクト)簡単なJavaScriptの/ OnDataBound 機能のプライマリを追加しました。 }


保護ボイドrdoPrimary_DataBound(オブジェクト送信者、のEventArgs e)の {RadioButtonListのrdlPrimary =(RadioButtonListの)送信者; foreach(rdlPrimary.ItemsのListItem li) { li.Attributes.Add( "onclick"、 "javascript:Primary( '" + li.Value + "')"); } }

+0

PreInitイベントまたはPage_Initイベントで処理を行い、その動作が同じか異なるか確認しましたか? – TheGeekYouNeed

答えて

0

SaveViewStateメソッドとLoadViewStateメソッドに保持する値を保存して取得し、それが機能するかどうかを確認します。また、InitとOnPreRenderというロジックを扱うためのライフサイクル前とそれ以降のイベントも見てください。これは過去に私のために働いてきました。

+0

LoadViewStateにオーバーライドを追加しようとしました。私がデバッグするときに、私がそのセクションに置いたものはどれもヒットしません。 1つの特定のユーザーコントロールと選択した値を取得するコードを追加しようとしました。その後、私はプログラム内のすべてのブレークポイントを無効にしました。その後、その一連のコード行にブレークポイントを追加しました。私がコードをステップ実行すると、それは決して燃えませんか? – eric

+0

私の腸の反応は、これは方法が複雑すぎることです。しようと簡単に何かに分解して...おそらく段階的なドロップダウンリストを使用して段階的にそれを構築する。 – IrishChieftain

+0

ユーザーの選択したViewStateを保存して保存しましたか? – IrishChieftain

関連する問題