каскадные выпадающие списки asp.net всегда выбирают первый элемент

Я использую три DropDownList на странице. И я привязываю данные к DDL1(DropDownList1) при загрузке страницы, используя также условие if(!Page.IsPostBack). И в событии DDL1 selectedIndexChanged я привязываю данные к DDL2, и он работает нормально. Но когда я пытаюсь сделать то же самое с DDL3 и DDL2 (например, привязка данных к DDL2 в событии SelectedIndexChanged DDL2), всегда DDL2 выбирает первый элемент, только если я выбираю случайный, и DDL2 по-прежнему идет первым элементом. Здесь все 3 DDL являются AutoPostback-true, Vistate-Enabled

Вот мой код:

ASPX — Код..

<form id="form1" runat="server">
<div>    
    <br />
    <asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
        <asp:ListItem Value="0">Select</asp:ListItem>
    </asp:DropDownList>
    <br />
    <br />
    <asp:DropDownList ID="DropDownList2" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownList2_SelectedIndexChanged">
        <asp:ListItem Value="0">Select</asp:ListItem>
    </asp:DropDownList>
    <br />
    <br />
    <asp:DropDownList ID="DropDownList3" runat="server" AutoPostBack="True">
        <asp:ListItem Value="0">Select</asp:ListItem>
    </asp:DropDownList>
    <br />    
</div>
</form>

Код .CS...

public partial class getcolumns : System.Web.UI.Page
{
private SqlConnection con;
private SqlDataAdapter da;
private DataTable dt;
private DataSet ds;

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        try
        {
            string query = " SELECT name, dbid FROM sys.sysdatabases where dbid > 4 order by name ";
            con = new SqlConnection(ConfigurationManager.AppSettings["godb"].ToString());
            da = new SqlDataAdapter(query, con);
            dt = new DataTable();
            ds = new DataSet();
            da.Fill(dt);
            DropDownList1.DataSource = dt.DefaultView.ToTable(true, "name", "dbid");
            //DropDownList1.DataValueField = "dbid";
            DropDownList1.DataTextField = "name";
            DropDownList1.DataBind();
        }
        catch (Exception) { }
    }
}

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
    try
    {
        DropDownList2.Items.Clear();
        string query = " SELECT TABLE_CATALOG, TABLE_NAME FROM " + DropDownList1.SelectedItem + ".INFORMATION_SCHEMA.tables ";
        con = new SqlConnection(ConfigurationManager.AppSettings["godb"].ToString());
        da = new SqlDataAdapter(query, con);
        dt = new DataTable();
        ds = new DataSet();
        da.Fill(ds);
        DropDownList2.DataSource = ds; // dt.DefaultView.ToTable(true, "TABLE_NAME", "TABLE_CATALOG");
        //DropDownList2.DataValueField = "TABLE_CATALOG";
        DropDownList2.DataTextField = "TABLE_NAME";
        DropDownList2.DataBind();
        DropDownList2.Items.Insert(0, new ListItem("--Select--", "0"));
    }
    catch { }
}

protected void DropDownList2_SelectedIndexChanged(object sender, EventArgs e)
{
    try
    {
        DropDownList3.Items.Clear();
        string query = " SELECT TABLE_NAME, COLUMN_NAME FROM  " + DropDownList1.SelectedItem + ".INFORMATION_SCHEMA.columns where TABLE_NAME = '" + DropDownList2.SelectedItem + "' ";
        con = new SqlConnection(ConfigurationManager.AppSettings["godb"].ToString());
        da = new SqlDataAdapter(query, con);
        dt = new DataTable();
        da.Fill(dt);
        DropDownList3.DataSource = dt.DefaultView.ToTable(true, "TABLE_NAME", "COLUMN_NAME");
        //DropDownList3.DataValueField = "TABLE_NAME";
        DropDownList3.DataTextField = "COLUMN_NAME";
        DropDownList3.DataBind();
    }
    catch (Exception) { }
}
}

Редактировать: - Это сработало хорошо, когда я игнорирую 'DataValueField' в DDL. Спасибо всем за вашу поддержку...


person Pavan Kumar    schedule 01.09.2015    source источник
comment
попробуйте поместить раскрывающиеся списки в UpdatePanel   -  person Shaminder Singh    schedule 01.09.2015
comment
Привет, спасибо за ваш комментарий. Я уже пробовал с updatePanel, но тот же результат   -  person Pavan Kumar    schedule 01.09.2015
comment
Проверьте мой обновленный ответ   -  person Shaminder Singh    schedule 01.09.2015
comment
Решено. Это сработало хорошо, когда я игнорирую «DataValueField» DDL. Спасибо всем за вашу поддержку...   -  person Pavan Kumar    schedule 01.09.2015


Ответы (2)


Это может быть несколько событий автопостбэка, поэтому, когда он срабатывает, сначала идет ddl1 и перезаписывает выбранный элемент во втором. Когда приходит второе событие, оно сбрасывается в состояние по умолчанию.

Вы можете попробовать использовать один и тот же метод события для обоих и в зависимости от того, что вызывает вызывающая сторона.

Используйте эти два (отправитель объекта, EventArgs e): D

person Darko    schedule 01.09.2015
comment
привет, спасибо за интерес к моему вопросу. Я попробовал использовать один и тот же метод Event для обоих ddls, пока результат не будет таким же. - person Pavan Kumar; 01.09.2015
comment
protected void ddl_SelectedIndexChanged (отправитель объекта, EventArgs e) { if (sender == DropDownList1) { } else if (sender == DropDownList2) { } } - person Pavan Kumar; 01.09.2015
comment
Попробуйте так: var senderDdl = sender as DropDownList; Это приводит к преобразованию типа из объекта в объект раскрывающегося списка, другими словами, делает «отправителя» осведомленным о том, что это на самом деле. Это дает вам копию всех свойств, как в вызывающем объекте (ddl1/ddl2/...) - person Darko; 01.09.2015
comment
Привет, Дарко. Это сработало хорошо, когда я игнорирую «DataValueField» DDL. Благодаря вашей поддержке... - person Pavan Kumar; 01.09.2015

Попробуйте использовать этот код, он отлично работает для меня.

aspx

<form id="form1" runat="server">
    <div>
    <asp:DropDownList  ID="DropDownList1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" >
    </asp:DropDownList>
    <asp:DropDownList ID="DropDownList2" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownList2_SelectedIndexChanged" >
    </asp:DropDownList> 
    <asp:DropDownList ID="DropDownList3" runat="server" AutoPostBack="True" >
    </asp:DropDownList>
    </div>
    </form>

.cs

    public List<string> list1 { get; set; }
    public List<string> list2 { get; set; }
    public List<string> list3 { get; set; }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            try
            {
                list1 = new List<string> { "a", "b", "c" };
                DropDownList1.DataSource = list1;
                DropDownList1.DataBind();
            }
            catch (Exception) { }
        }
    }

    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        try
        {
            list2 = new List<string> { "1a", "1b", "1c" };
            DropDownList2.DataSource = list2; 
            DropDownList2.DataBind();
        }
        catch { }
    }

    protected void DropDownList2_SelectedIndexChanged(object sender, EventArgs e)
    {
        try
        {
            list3 = new List<string> { "2a", "2b", "2c" };
            DropDownList3.DataSource = list3;
            DropDownList3.DataBind();
        }
        catch (Exception) { }
    }

Я просто удалил ваш options по умолчанию в раскрывающихся списках и удалил viewstatemode и использовал вашу привязку данных вместо списков.

person Shaminder Singh    schedule 01.09.2015
comment
Shaminder, он работает так, как мне нужно @Lists, но когда я использую привязки данных, он остается прежним, и я тоже пробовал это. - person Pavan Kumar; 01.09.2015
comment
for (int i = 0; i ‹ dt.Rows.Count; i++) { DropDownList2.Items.Add(new ListItem(dt.Rows[i][TABLE_NAME].ToString(), dt.Rows[i][TABLE_CATALOG] .Нанизывать())); } - person Pavan Kumar; 01.09.2015
comment
Не используйте прямые подключения к функциям страницы, используйте методы для отправки lists для привязки - person Shaminder Singh; 01.09.2015
comment
Привет, Шаминдер. Это сработало хорошо, когда я игнорирую «DataValueField» DDL. Благодаря вашей поддержке... - person Pavan Kumar; 01.09.2015