2014-02-17 3 views
0

Я пишу простую программу, которая соединяется с базой данных и считывает данные из двух таблиц и записывает их в два списка DropDownLists (DDL). DDL имеет структуру, такую ​​как родительский и дочерний. Это мой код:DropDownList with SelectedIndex = 0

protected void Page_Load(object sender, EventArgs e) 
{ 
    FillControls(); 
    if (!IsPostBack) 
    { 
     ddl_SelectedIndexChanged((DropDownList)PlaceHolder1.FindControl("ddlTurCountry"), null); 
    } 
    else 
    { 
     if (((DropDownList)PlaceHolder1.FindControl("ddlTurCountry")).SelectedIndex == 0) ddl_SelectedIndexChanged((DropDownList)PlaceHolder1.FindControl("ddlTurCountry"), null); //without this string dropDownList doesn't call ddl_SelectedIndexChanged() when it's SelectedIndex=0 
    } 
} 

private void FillControls() 
{ 
    Panel panel = new Panel(); 
    Label lbl = new Label(); 
    lbl.Text = "Country: "; 
    panel.Controls.Add(lbl); 
    DropDownList ddl = new DropDownList(); 
    ddl.ID = "ddlTurCountry"; 
    ddl.DataTextField = "CountryName"; 
    ddl.DataValueField = "CountryName"; 
    ddl.SelectedIndexChanged += new EventHandler(ddl_SelectedIndexChanged); 
    ddl.AutoPostBack = true; 
    panel.Controls.Add(ddl); 
    panel.Controls.Add(new LiteralControl("<br />")); 

    lbl = new Label(); 
    lbl.Text = "Kurort: "; 
    panel.Controls.Add(lbl); 
    ddl = new DropDownList(); 
    ddl.ID = "ddlTurKurort"; 
    ddl.DataTextField = "KurortName"; 
    ddl.DataValueField = "KurortName";    
    panel.Controls.Add(ddl); 
    PlaceHolder1.Controls.Add(panel); 

    FillDDL("ddlTurCountry", "SELECT CountryName from Countries"); 
} 

private void ddl_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (((DropDownList)sender).ID == "ddlTurCountry") 
    { 
     FillDDL("ddlTurKurort", "SELECT Kurorts.KurortName FROM Kurorts INNER JOIN Countries ON Countries.idCountry = Kurorts.idCountry WHERE (Countries.CountryName = N'" + ((DropDownList)PlaceHolder1.FindControl("ddlTurCountry")).SelectedValue + "')"); 
    } 
} 

private void FillDDL(string ddlID, string SQLCommand) 
{ 
    ((DropDownList)PlaceHolder1.FindControl(ddlID)).DataSource = GetDataFromDB(SQLCommand); 
    ((DropDownList)PlaceHolder1.FindControl(ddlID)).DataBind(); 
} 

private DataTable GetDataFromDB(string SQLCommand) 
{ 
    DataTable dt = new DataTable(); 
    string sqlcnString = @"Data Source=.\SQLEXPRESS;Initial Catalog=turs;Integrated Security=True;Pooling=False"; 
    SqlConnection sqlcn = new SqlConnection(sqlcnString); 
    if (sqlcn.State.ToString() == "Closed") sqlcn.Open(); 
    SqlDataAdapter dataAdapter = new SqlDataAdapter(SQLCommand, sqlcn); 
    dataAdapter.Fill(dt); 
    sqlcn.Close(); 
    return dt; 
} 

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

Если я выбираю первое значение, то второй DDL не заполняется. Когда я смотрю с помощью отладчика, я вижу, что метод ddl_SelectedIndexChanged не применяется, когда SelectedIndex первого DDL равен нулю. В этом случае я добавил эту строку:

if (((DropDownList)PlaceHolder1.FindControl("ddlTurCountry")).SelectedIndex == 0) 
    ddl_SelectedIndexChanged((DropDownList)PlaceHolder1.FindControl("ddlTurCountry"), null); 

в Page_Load, но мне не нравится это, и я не понимаю, почему это не работает, если selectedIndex=0.


решаемые

protected void Page_Init(object sender, EventArgs e) 
    { 
     FillControls(); 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) ddl_SelectedIndexChanged((DropDownList)PlaceHolder1.FindControl("ddlTurCountry"), null); 
    } 

ответ

1

Вы заселение выпадающий список каждый раз, когда ваша страница обновляется. Не делай этого. Вызывайте FillControls(), если! Page.Postback

protected void Page_Load(object sender, EventArgs e) 
{ 

    if (!IsPostBack) 
    { 
     FillControls(); 
     //Not sure why you have this here, probably not needed 
     ddl_SelectedIndexChanged((DropDownList)PlaceHolder1.FindControl("ddlTurCountry"), null); 
    } 
    else 
    { 

    } 
} 
+0

всех disapper после обратной передачи, потому что ОЛЛ управления создает динамически – mit

+0

Почему нужно DropDownList быть созданы динамически? Не можете ли вы разместить его на своей странице aspx? –

+1

Вы также можете посмотреть на это: http://www.aspsnippets.com/Articles/Creating-Dynamic-DropDownList-Controls-in-ASP.Net.aspx –

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