2012-03-30 18 views
1

Ich habe zwei Dropdownlists eine für den Typ eines Soldaten und eines für die Zahl der Soldaten der Spieler i kaufen dürfen. Ich bevölkern ddlSoldiers mit einem LinqDataSource in der Aspx-Seite wie folgt aus:Artikel von Dropdownlist entfernen

<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> 

Die andere Liste ddlSoldierNumber in der Pageload wie folgt aufgefüllt wird:

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()); 
      } 

     } 
    } 

Aber wenn ich will, um die Werte von ddlSoldierNumber i erhalten Erhalte nur den ersten Wert in dieser Liste. Ich versuche, die Nummer mit dem Klick auf eine Schaltfläche wie folgt zu erhalten:

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

Ich habe versucht, die Linie zu setzen:

ddlSoldierNumber.Items.Clear(); 

andere Orte, aber ohne Erfolg. Wer weiß, wie ich die Nummernliste löschen kann, nachdem ich die Taste gedrückt, bevor die ddlSoldierNumber neu besiedelt werden?

+2

'ddlSoldierNumber.Items.Clear();' sollten Sie die Liste löschen, haben Sie die PostBack-Eigenschaft der Schaltfläche auf True festgelegt? – user959631

Antwort

3

Wenn Sie ddlSoldierNumber auf der Basis der Auswahl aus ddlSoldiers auffüllen möchten, können Sie beim Laden der Seite keine Werte zu ddlSoldierNumber hinzufügen. dafür müssen Sie Ihre Seite zu laden Ereigniscode in (ddlSoldiers) ausgewählten Indexänderungsereignis hinzufügen.

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

Wenn ich mich richtig erinnere, die Pageload vor Ihrer Eventhandler für die Schaltfläche ausgeführt wird, haben Sie versucht, die ddlSolderNumber.Items.Clear platzieren(); im Click-Eventhandler, nachdem Sie die Beschriftung geändert haben? (Ich weiß, dass dies nicht das Problem mit Ihrer ersten Frage lösen)

Dafür könnten Sie versuchen: (Wenn Im verwirrend Ich entschuldige mich, ich bin schlecht zu erklären ich) Sie könnten eine „Auffüllen“ Methode für Ihre ddlSoldierNumber Liste erstellen , die du nach deinem Klick-Event anrufst. In Ihrem Pageload können Sie dann auf einem Scheck von „if (! Postback)“ Ihre Standard-Startlogik ausgeführt werden.

+0

Ja, wollen Sie auf jeden Fall wickeln, was in einem if (! Postback) in Ihrer Seite zu laden passiert. Denken Sie daran, dass dies jedes Mal ausgeführt wird, wenn der Benutzer auf etwas klickt. Sie möchten Ihre Listen nicht löschen und sie jedes Mal neu auffüllen, wenn ein Postback aufgerufen wird –