2012-03-30 19 views
1

私は、兵士のタイプとプレイヤーが購入できる兵士の数の2つのドロップダウンリストを持っています。他のリストddlSoldierNumberは、このようpageloadに移入されDropDownListからアイテムを削除する

<asp:DropDownList ID="ddlSoldiers" runat="server" 
        DataSourceID="LinqDataSource2" DataTextField="type" 
        DataValueField="troopid" AutoPostBack="True"> 
       </asp:DropDownList> 
       <asp:LinqDataSource ID="LinqDataSource2" runat="server" 
        ContextTypeName="BrowserSpill.LinqClass1DataContext" EntityTypeName="" 
        Select="new (type, troopid)" TableName="Troops"> 
       </asp:LinqDataSource> 

:私はこのようなaspxページでLinqDataSourceコントロールでddlSoldiersを移入

protected void Page_Load(object sender, EventArgs e) 
    { 

     if (Session["userRole"] == null || Session["userRole"].Equals("admin")) 
     { 
      Response.Redirect("Login.aspx"); 
     } 

     int userid = Convert.ToInt32(Session["userid"]); 

     if(string.IsNullOrEmpty(ddlSoldiers.SelectedValue)) 
     { 
      var varTroopType = dc.Troops.Single(t => t.troopid == 1).type; 
      string troopType = Convert.ToString(varTroopType); 

      var varBuildingId = dc.Buildings.Single(b => b.soldierType == troopType).buildingid; 
      int buildingId = Convert.ToInt32(varBuildingId); 

      var varNumberOfBuildings = 
      dc.Towns.Single(t => (t.buildingid == buildingId) && (t.userid == userid)).number; 

      int numberOfBuildings = Convert.ToInt32(varNumberOfBuildings); 

      for (int i = 1; i < numberOfBuildings + 1; i++) 
      { 
       ddlSoldierNumber.Items.Add(i.ToString()); 
      } 
     } 
     else 
     { 

      ddlSoldierNumber.Items.Clear(); 

      string troopType = ddlSoldiers.SelectedItem.Text; 

      var varBuildingId = dc.Buildings.Single(b => b.soldierType == troopType).buildingid; 
      int buildingId = Convert.ToInt32(varBuildingId); 

      var varNumberOfBuildings = 
       dc.Towns.Single(t => (t.buildingid == buildingId) && (t.userid == userid)).number; 

      int numberOfBuildings = Convert.ToInt32(varNumberOfBuildings); 


      for(int i = 1; i < numberOfBuildings+1; i++) 
      { 
       ddlSoldierNumber.Items.Add(i.ToString()); 
      } 

     } 
    } 

しかし、私はddlSoldierNumber私から値を取得したいときそのリストの最初の値だけを取得します。私はラインを入れて試してみました

protected void btnBuySoldier_Click(object sender, EventArgs e) 
    { 
     string numbertobuy = ddlSoldierNumber.SelectedItem.Value; 
     lblAntall.Text = numbertobuy; 
    } 

ddlSoldierNumber.Items.Clear(); 

他の場所をしかし運のない私はこのようなボタンをクリックするだけで数を取得しよう。誰も私がボタンを押した後、ddlSoldierNumberが再投入される前に番号リストをクリアする方法を知っていますか?

+2

'ddlSoldierNumber.Items.Clear();'ボタンのPostBackプロパティをTrueに設定していますか? – user959631

答えて

3

ddlSoldierからの選択に基づいてddlSoldierNumberを設定する場合は、ページのロードイベントでddlSoldierNumberに値を追加できません。そのためには、ページロードイベントコードを(ddlSoldiers)選択されたインデックス変更イベントに追加する必要があります。

protected void ddlSoldiers_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (Session["userRole"] == null || Session["userRole"].Equals("admin")) 
    { 
     Response.Redirect("Login.aspx"); 
    } 

    int userid = Convert.ToInt32(Session["userid"]); 

    if (string.IsNullOrEmpty(ddlSoldiers.SelectedValue)) 
    { 
     var varTroopType = dc.Troops.Single(t => t.troopid == 1).type; 
     string troopType = Convert.ToString(varTroopType); 

     var varBuildingId = dc.Buildings.Single(b => b.soldierType == troopType).buildingid; 
     int buildingId = Convert.ToInt32(varBuildingId); 

     var varNumberOfBuildings = 
     dc.Towns.Single(t => (t.buildingid == buildingId) && (t.userid == userid)).number; 

     int numberOfBuildings = Convert.ToInt32(varNumberOfBuildings); 

     for (int i = 1; i < numberOfBuildings + 1; i++) 
     { 
      ddlSoldierNumber.Items.Add(i.ToString()); 
     } 
    } 
    else 
    { 

     ddlSoldierNumber.Items.Clear(); 

     string troopType = ddlSoldiers.SelectedItem.Text; 

     var varBuildingId = dc.Buildings.Single(b => b.soldierType == troopType).buildingid; 
     int buildingId = Convert.ToInt32(varBuildingId); 

     var varNumberOfBuildings = 
      dc.Towns.Single(t => (t.buildingid == buildingId) && (t.userid == userid)).number; 

     int numberOfBuildings = Convert.ToInt32(varNumberOfBuildings); 


     for (int i = 1; i < numberOfBuildings + 1; i++) 
     { 
      ddlSoldierNumber.Items.Add(i.ToString()); 
     } 

    } 

} 
0

私が正しく覚えていれば、pageloadはボタンのイベントハンドラの前に実行されます。ddlSolderNumber.Items.Clear()を配置しようとしましたか?ラベルを変更した後、Clickイベントハンドラーで?そのために (私はこのdoesntのは、あなたの最初の質問の問題を解決する知っている)

あなたは試みることができる:(Imが混乱した場合、私は自分自身を説明する時Imが悪い、謝罪) あなたのddlSoldierNumberのリストについては、「移入」メソッドを作成することができますクリックイベントの後に呼び出すことができます。 pageloadでは、 "if(!PostBack)"のチェックでデフォルトの起動ロジックを実行できます。

+0

ええ、あなたは間違いなくif(!ポストバック)のあなたのページの読み込みで起こることを包み込みたいと思っています。これは、ユーザーが何かをクリックするたびに実行されることに注意してください。ポストバックが呼び出されるたびにリストをクリアして再ポピュレートしたくない –

関連する問題