2015-09-01 14 views
1

Я использую три DropDownLists на странице. И я привязываю данные к DDL1 (DropDownList1) на pageload, используя условие (! Page.IsPostBack). И на DDL1 selectedIndexChanged Event Я привязываю данные к DDL2 и его работоспособность. Но когда я пытаюсь сделать то же самое с DDL3 & DDL2 (Как данные привязки к DDL2 при событии SelectedIndexChanged DDL2), всегда DDL2 выбирает первый элемент только в том случае, если я выбираю случайный случай, и DDL2 по-прежнему идет первым элементом. Здесь Все 3 DDLS являются AutoPostBack-правда, Vistate-Enabledasp.net cascading dropdownlists всегда выбирает первый элемент

Вот мой код:

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) { } 
} 
} 

Edit: - Он работал хорошо, когда я Игнорируйте «DataValueField» из DDL, Спасибо Все для вашей поддержки ...

+0

попробуйте поместить свои выпадающие списки в 'UpdatePanel' –

+0

Привет, благодарю за ваш комментарий. Я уже пробовал с updatePanel, но и тот же результат –

+0

Проверяют мой последний ответ –

ответ

0

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

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

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

+0

привет, спасибо за интерес к моему вопросу. Я пробовал использовать тот же метод Event для обоих ddls, пока результат не будет таким же. –

+0

protected void ddl_SelectedIndexChanged (object sender, EventArgs e) { if (sender == DropDownList1) {} else if (sender == DropDownList2) { } } –

+0

Попробуйте следующее: var senderDdl = отправитель как DropDownList; Это делает типпередачу от объекта к объекту dropdownlist, другими словами делает «отправителя» осведомленным о том, что это на самом деле. Это дает вам копию всех свойств, как в объекте-вызывателе (ddl1/ddl2/...) – Darko

0

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

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 и использовать привязку данных вместо списков.

+0

Shaminder, его работа по мере необходимости @ Списки, но когда вы идете с привязками к данным, все равно то же самое, и я тоже пробовал это –

+0

для (int i = 0; i

+0

Не используйте прямые подключения к функциям страницы, используйте методы для отправки «списков» для привязки –

 Смежные вопросы

  • Нет связанных вопросов^_^