asp .net выпадающий список selectedindex не работает

У меня есть следующий фрагмент кода:

DataRow CreateRow(DataTable dt, string name, string country)
    {
        DataRow dr = dt.NewRow();
        dr["Name"] = name;
        dr["Country"] = country;
        return dr;
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        // creating the data table
        DataTable dt = new DataTable("Student Details");

        // adding two columns Name and Country
        dt.Columns.Add("Name", typeof(String));
        dt.Columns.Add("Country", typeof(String));

        // create 3 rows        
        dt.Rows.Add(CreateRow(dt, "Varun", "India"));
        dt.Rows.Add(CreateRow(dt, "Li", "China"));
        dt.Rows.Add(CreateRow(dt, "Yishan", "China"));

        // create a data view 
        DataView dv = new DataView(dt);

        DropDownList1.DataSource = dv;
        DropDownList1.DataTextField = "Name";
        DropDownList1.DataValueField = "Country";
        DropDownList1.DataBind();
    }
    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        int x = DropDownList1.SelectedIndex;
        int temp = 0;
        temp++;
    }

и разметка выглядит так:

<body>
    <form id="form1" runat="server">
    <div>

        <asp:Label ID="Label1" runat="server"></asp:Label>
        <br />
        <br />
        <asp:DropDownList ID="DropDownList1" runat="server" 
            onselectedindexchanged="DropDownList1_SelectedIndexChanged"
            AutoPostBack="true">
        </asp:DropDownList>

    </div>
    </form>
</body>

Проблема в том, что ярлык всегда показывает Варуна, независимо от того, что я выбираю. Я отладил код и обнаружил, что «DropDownList1.SelectedIndex» по какой-то причине всегда возвращает 0.

Я не уверен, почему это происходит. Функция «DropDownList1_SelectedIndexChanged» вызывается каждый раз, когда я выбираю что-то из выпадающего списка.

Спасибо


person Varun Sharma    schedule 29.08.2011    source источник


Ответы (4)


Похоже, вы привязываете раскрывающийся список в Page_Load...

Помните, что когда раскрывающийся список изменяется, он выполняет обратную публикацию (AutoPostBack='True'), и, поскольку вы привязываетесь к Page_Load, он просто будет перепривязываться каждый раз при изменении индекса... не то, что вы хотите!

вы должны сделать что-то вроде этого:

if (!IsPostBack)
{  
    BindDropDownList1();      
}
person c0deNinja    schedule 29.08.2011

Убедитесь, что ViewState включен (для событий изменения), и переместите код из OnLoad в OnInit. Это предотвратит перезапись ViewState, поскольку это происходит после Init и перед Load.

При желании вы также должны обернуть код инициализации внутри проверки IsPostback, чтобы избежать загрузки данных при каждом запросе.

person TheCodeKing    schedule 29.08.2011
comment
Спасибо TheCodeKing за альтернативу. - person Varun Sharma; 30.08.2011

вы можете использовать этот код:

  foreach (ListItem item in DropDownList1.Items)
     {
            if (item.Text == defaultText) 
            {
                item.Selected = true;
                break;
            }
     }
person ali khezri    schedule 24.01.2013

Вы можете попробовать переопределить метод OnPreRender страницы:

protected override OnPreRender(EventArgs e)
{
    DropDownList1.SelectedIndex = Convert.ToInt32(ViewState["PageIndex"]);

    base.OnPreRender(e);
}

Также убедитесь, что EnableViewState установлено на True.

person Franz Steven Labawan    schedule 18.06.2013