Twistar
Twistar

Reputation: 782

Remove items from DropDownList

I have two DropDownLists one for the type of a soldier and one for the number of soldiers the player i allowed to buy. I populate ddlSoldiers with a LinqDataSource in the aspx page like this:

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

The other list ddlSoldierNumber is populated in the pageload like this:

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

        }
    }

But when i want to get the values from ddlSoldierNumber i only get the first value in that list. I try to get the number with the click of a button like this:

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

I have tried to put the line:

ddlSoldierNumber.Items.Clear();

other places but without any luck. Does anyone know how i can clear the number list after I press the button and before the ddlSoldierNumber get repopulated?

Upvotes: 1

Views: 16546

Answers (2)

R.D.
R.D.

Reputation: 7403

if you want to populate ddlSoldierNumber on the basis of selection from ddlSoldiers then you can not add values to ddlSoldierNumber in page load event. for that you have to add your page load event code in (ddlSoldiers) selected index change event.

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

    }

}

Upvotes: 3

user1075135
user1075135

Reputation: 1

If I remember correctly, the pageload is run before your eventhandler for the button, have you tried placing the ddlSolderNumber.Items.Clear(); in the Click eventhandler after you change the label? (I know this doesnt solve the issue with your first question)

For that you could try: (If Im confusing I apologize, Im bad at explaining myself) You could create a "populate" method for your ddlSoldierNumber list, that you call after your click-event. In your pageload, you could then on a check of "if (!PostBack)" run your default startup logic.

Upvotes: 0

Related Questions