Я пишу простую программу, которая соединяется с базой данных и считывает данные из двух таблиц и записывает их в два списка 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);
}
всех disapper после обратной передачи, потому что ОЛЛ управления создает динамически – mit
Почему нужно DropDownList быть созданы динамически? Не можете ли вы разместить его на своей странице aspx? –
Вы также можете посмотреть на это: http://www.aspsnippets.com/Articles/Creating-Dynamic-DropDownList-Controls-in-ASP.Net.aspx –