2012-03-30 48 views
1

我有两个DropDownLists一个用于士兵的类型,一个用于我允许购买的玩家的士兵数量。我填充ddlSoldiers,像这样在ASPX页面的LinqDataSource:从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> 

另一个列表ddlSoldierNumber在页面加载填充像这样:

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();'应该清除列表,你是否将Button的PostBack属性设置为True? – user959631 2012-03-30 13:23:47

回答

3

如果您想根据ddlSoldiers中的选择填充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

如果我没有记错,页面加载是在按钮的事件处理程序之前运行的,您是否尝试过放置ddlSolderNumber.Items.Clear();在更改标签后,Click事件处理程序中? (我知道这并不解决您的第一个问题的问题)

对于您可以尝试:(如果林困惑我道歉,林坏在解释自己) 你可以为你的ddlSoldierNumber列表创建一个“填充”方法,您在点击事件后致电。 在你的页面载入中,你可以检查“if(!PostBack)”运行你的默认启动逻辑。

+0

是的,你确实想要在你的页面加载if(!Postback)中包装发生什么。请记住,每次用户点击任何内容时都会运行此操作。您不希望在每次调用回发时清除您的列表并重新填充它们 – 2012-03-30 13:45:09