Pageload 中的下拉列表 webform 动态注册事件不会触发
dropdown list webform dynamic register event in Pageload won't fire
我需要一个动态注册事件处理程序。
我尝试为 ASP.NET 网络表单编写一些片段代码,并意识到 'something' 使下拉列表不会触发事件 SelectedIndexChanged。
第一个片段(效果很好)。我在 ASPX 文件中注册事件处理程序。
<form id="form1" runat="server">
<asp:Label ID="lblName" runat="server" Text="Label"></asp:Label>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<asp:DropDownList ID="Ddl1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="Ddl1_SelectedIndexChanged">
</asp:DropDownList>
<asp:DropDownList ID="Ddl2" runat="server" AutoPostBack="true" OnSelectedIndexChanged="Ddl2_SelectedIndexChanged">
</asp:DropDownList>
<asp:Button ID="BtnSubmit" runat="server" Text="Submit" OnClick="BtnSubmit_Click" />
</form>
然后在 CS 文件中,我创建了 2 个这样的函数
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
Ddl2.Items.Add(new ListItem("1", "1"));
Ddl2.Items.Add(new ListItem("2", "2"));
Ddl2.Items.Add(new ListItem("3", "3"));
Ddl2.Items.Add(new ListItem("4", "4"));
Ddl1.Items.Add(new ListItem("1", "1"));
Ddl1.Items.Add(new ListItem("2", "2"));
Ddl1.Items.Add(new ListItem("3", "3"));
Ddl1.Items.Add(new ListItem("4", "4"));
BtnSubmit.Click += new EventHandler(BtnSubmit_Click);
Ddl1.SelectedIndex = 0;
Ddl2.SelectedIndex = 0;
}
}
public void Ddl2_SelectedIndexChanged(object sender, EventArgs e)
{
var st = new StackTrace();
var sf = st.GetFrame(0);
var currentMethodName = sf.GetMethod();
Console.WriteLine(currentMethodName);
Label1.Text = Ddl2.SelectedValue;
}
public void Ddl1_SelectedIndexChanged(object sender, EventArgs e)
{
var st = new StackTrace();
var sf = st.GetFrame(0);
var currentMethodName = sf.GetMethod();
Console.WriteLine(currentMethodName);
Label1.Text = Ddl1.SelectedValue;
}
其次,我在视图上删除了 dropwdown 1 的 Autopostback 和 OnSelectedIndexChanged,并将注册处理程序移至 PageLoad 代码。现在它不会再火了
下拉菜单 1 将提升刷新页面。但是事件处理程序不会再触发。
我正在使用 VS2017 Pro & .NET 4.7.2
<form id="form1" runat="server">
<asp:Label ID="lblName" runat="server" Text="Label"></asp:Label>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<asp:DropDownList ID="Ddl1" runat="server">
</asp:DropDownList>
<asp:DropDownList ID="Ddl2" runat="server" AutoPostBack="true" OnSelectedIndexChanged="Ddl2_SelectedIndexChanged">
</asp:DropDownList>
<asp:Button ID="BtnSubmit" runat="server" Text="Submit" OnClick="BtnSubmit_Click" />
</form>
在 CS 代码中:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
Ddl2.Items.Add(new ListItem("1", "1"));
Ddl2.Items.Add(new ListItem("2", "2"));
Ddl2.Items.Add(new ListItem("3", "3"));
Ddl2.Items.Add(new ListItem("4", "4"));
Ddl1.Items.Add(new ListItem("1", "1"));
Ddl1.Items.Add(new ListItem("2", "2"));
Ddl1.Items.Add(new ListItem("3", "3"));
Ddl1.Items.Add(new ListItem("4", "4"));
BtnSubmit.Click += new EventHandler(BtnSubmit_Click);
Ddl1.SelectedIndex = 0;
Ddl2.SelectedIndex = 0;
Ddl1.AutoPostBack = true;
Ddl1.SelectedIndexChanged += new System.EventHandler(Ddl1_SelectedIndexChanged);
}
}
public void Ddl2_SelectedIndexChanged(object sender, EventArgs e)
{
var st = new StackTrace();
var sf = st.GetFrame(0);
var currentMethodName = sf.GetMethod();
Console.WriteLine(currentMethodName);
Label1.Text = Ddl2.SelectedValue;
}
public void Ddl1_SelectedIndexChanged(object sender, EventArgs e)
{
var st = new StackTrace();
var sf = st.GetFrame(0);
var currentMethodName = sf.GetMethod();
Console.WriteLine(currentMethodName);
Label1.Text = Ddl1.SelectedValue;
}
谁能帮帮我:
- 在页面加载或 APSX 文件上注册事件处理程序有什么区别?
- 我可以注册什么页面生命周期事件来触发事件处理程序?
- 这是微软的bug吗?如果是,我在哪里 post 这个错误?
长话短说,每个请求都会重新创建页面和控件。
因此,"Posting Back" 将再次加载页面,但 IsPostBack
设置为 true
,并且您的活动注册永远不会到达。
我需要一个动态注册事件处理程序。
我尝试为 ASP.NET 网络表单编写一些片段代码,并意识到 'something' 使下拉列表不会触发事件 SelectedIndexChanged。
第一个片段(效果很好)。我在 ASPX 文件中注册事件处理程序。
<form id="form1" runat="server">
<asp:Label ID="lblName" runat="server" Text="Label"></asp:Label>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<asp:DropDownList ID="Ddl1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="Ddl1_SelectedIndexChanged">
</asp:DropDownList>
<asp:DropDownList ID="Ddl2" runat="server" AutoPostBack="true" OnSelectedIndexChanged="Ddl2_SelectedIndexChanged">
</asp:DropDownList>
<asp:Button ID="BtnSubmit" runat="server" Text="Submit" OnClick="BtnSubmit_Click" />
</form>
然后在 CS 文件中,我创建了 2 个这样的函数
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
Ddl2.Items.Add(new ListItem("1", "1"));
Ddl2.Items.Add(new ListItem("2", "2"));
Ddl2.Items.Add(new ListItem("3", "3"));
Ddl2.Items.Add(new ListItem("4", "4"));
Ddl1.Items.Add(new ListItem("1", "1"));
Ddl1.Items.Add(new ListItem("2", "2"));
Ddl1.Items.Add(new ListItem("3", "3"));
Ddl1.Items.Add(new ListItem("4", "4"));
BtnSubmit.Click += new EventHandler(BtnSubmit_Click);
Ddl1.SelectedIndex = 0;
Ddl2.SelectedIndex = 0;
}
}
public void Ddl2_SelectedIndexChanged(object sender, EventArgs e)
{
var st = new StackTrace();
var sf = st.GetFrame(0);
var currentMethodName = sf.GetMethod();
Console.WriteLine(currentMethodName);
Label1.Text = Ddl2.SelectedValue;
}
public void Ddl1_SelectedIndexChanged(object sender, EventArgs e)
{
var st = new StackTrace();
var sf = st.GetFrame(0);
var currentMethodName = sf.GetMethod();
Console.WriteLine(currentMethodName);
Label1.Text = Ddl1.SelectedValue;
}
其次,我在视图上删除了 dropwdown 1 的 Autopostback 和 OnSelectedIndexChanged,并将注册处理程序移至 PageLoad 代码。现在它不会再火了
下拉菜单 1 将提升刷新页面。但是事件处理程序不会再触发。 我正在使用 VS2017 Pro & .NET 4.7.2
<form id="form1" runat="server">
<asp:Label ID="lblName" runat="server" Text="Label"></asp:Label>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<asp:DropDownList ID="Ddl1" runat="server">
</asp:DropDownList>
<asp:DropDownList ID="Ddl2" runat="server" AutoPostBack="true" OnSelectedIndexChanged="Ddl2_SelectedIndexChanged">
</asp:DropDownList>
<asp:Button ID="BtnSubmit" runat="server" Text="Submit" OnClick="BtnSubmit_Click" />
</form>
在 CS 代码中:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
Ddl2.Items.Add(new ListItem("1", "1"));
Ddl2.Items.Add(new ListItem("2", "2"));
Ddl2.Items.Add(new ListItem("3", "3"));
Ddl2.Items.Add(new ListItem("4", "4"));
Ddl1.Items.Add(new ListItem("1", "1"));
Ddl1.Items.Add(new ListItem("2", "2"));
Ddl1.Items.Add(new ListItem("3", "3"));
Ddl1.Items.Add(new ListItem("4", "4"));
BtnSubmit.Click += new EventHandler(BtnSubmit_Click);
Ddl1.SelectedIndex = 0;
Ddl2.SelectedIndex = 0;
Ddl1.AutoPostBack = true;
Ddl1.SelectedIndexChanged += new System.EventHandler(Ddl1_SelectedIndexChanged);
}
}
public void Ddl2_SelectedIndexChanged(object sender, EventArgs e)
{
var st = new StackTrace();
var sf = st.GetFrame(0);
var currentMethodName = sf.GetMethod();
Console.WriteLine(currentMethodName);
Label1.Text = Ddl2.SelectedValue;
}
public void Ddl1_SelectedIndexChanged(object sender, EventArgs e)
{
var st = new StackTrace();
var sf = st.GetFrame(0);
var currentMethodName = sf.GetMethod();
Console.WriteLine(currentMethodName);
Label1.Text = Ddl1.SelectedValue;
}
谁能帮帮我:
- 在页面加载或 APSX 文件上注册事件处理程序有什么区别?
- 我可以注册什么页面生命周期事件来触发事件处理程序?
- 这是微软的bug吗?如果是,我在哪里 post 这个错误?
长话短说,每个请求都会重新创建页面和控件。
因此,"Posting Back" 将再次加载页面,但 IsPostBack
设置为 true
,并且您的活动注册永远不会到达。