我很难搞清楚这一点,我希望你们能帮助我。
我有一个名为Index.aspx
的页面,DropDownList
是一个单独的UserControl
类(因为它将在其他页面中使用)。这是代码:
UcSelecionarLocal.ascx:
<%@ Control Language="C#" AutoEventWireup="true"
CodeBehind="UcSelecionarLocal.ascx.cs"
Inherits="QuickMassage.uc.UcSelecionarLocal" %>
<asp:DropDownList ID="ddlLocais" runat="server"
CssClass="span4 dropdown-toggle" AutoPostBack="true">
</asp:DropDownList>
UcSelecionarLocal.ascx.cs:
public partial class UcSelecionarLocal : UserControl {
protected void Page_Load(object sender, EventArgs e) {
if (!this.IsPostBack) {
PreencherLocais();
}
}
private void PreencherLocais() {
ddlLocais.Items.Clear();
ddlLocais.Items.Add(new ListItem("Selecione", "0"));
ControleLocal controle = new ControleLocal();
DataTable tab = controle.ListarLocais();
foreach (DataRow row in tab.Rows) {
ddlLocais.Items.Add(new ListItem(row["Descricao"].ToString(),
row["ID"].ToString()));
}
}
}
此控件放在Index.aspx
中并正确加载其值。它包含的表单将操作设置为agendamentos.aspx
。当我更改ddlist
时,页面将按原样提交给表单操作页面。
在另一页上,问题开始了:我将参数发布到此页面,其中一个是ddlist
值。在即时窗口中,我检查了值,它就在那里,假设它是1。
长话短说,我有这段代码:
agendamentos.aspx.cs:
protected void Page_Load(object sender, EventArgs e) {
DropDownList locais = ObterComponenteListaLocais();
try {
locais.SelectedIndex =
int.Parse(HttpContext.Current.Request["ucSelLocal$ddlLocais"]);
}
调试时,我看到locais.SelectedIndex
为-1。作业完成后,它仍为-1。页面加载,然后我再次将ddlist
值更改为2.当调试上面的相同代码时,我看到locais.SelectedIndex
现在是1.再次,将它设置为2,因为它通常是,没有效果。如果我再次将ddlist
更改为3,则SelectedIndex
变为2,并且不会取值3.
换句话说:新加载页面中索引的值是之前加载的页面的值。
你们能帮助我吗?
答案 0 :(得分:2)
这是因为在加载用户控件之前,页面中的Page_Load事件正在触发。这样做:
public partial class UcSelecionarLocal : UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
}
public void PreencherLocais()
{
ddlLocais.Items.Clear();
ddlLocais.Items.Add(new ListItem("Selecione", "0"));
ControleLocal controle = new ControleLocal();
DataTable tab = controle.ListarLocais();
foreach (DataRow row in tab.Rows)
{
ddlLocais.Items.Add(new ListItem(row["Descricao"].ToString(), row["ID"].ToString()));
}
}
}
然后在你的aspx页面中:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
this.idOfYourUserControl.PreencherLocais();
DropDownList locais = ObterComponenteListaLocais();
try {
locais.SelectedIndex =
int.Parse(HttpContext.Current.Request["ucSelLocal$ddlLocais"]);
}
}
另外,因为您的问题有点令人困惑,重要的一点是,在从回发数据的控件中捕获数据之前,Page_Load会触发。所以这是一个获取信息的好地方,因为它将是以前的信息。这就是为什么你需要创建一个函数来触发按钮点击之类的东西,它会在加载控件数据后执行。