C# 动态加载时,用户控件中的DropDownList在第一次回发时丢失SelectedValue
我有一个ASPX页面,其中有一个占位符,其中动态加载用户控件。HTML标记如下所示:C# 动态加载时,用户控件中的DropDownList在第一次回发时丢失SelectedValue,c#,asp.net,dynamic-usercontrols,C#,Asp.net,Dynamic Usercontrols,我有一个ASPX页面,其中有一个占位符,其中动态加载用户控件。HTML标记如下所示: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="Test" %> <!DOCTYPE html> <html> <head runat="server"> </head> <body> <form id="f
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="Test" %>
<!DOCTYPE html>
<html>
<head runat="server">
</head>
<body>
<form id="form1" runat="server">
<asp:Button ID="btnNumbers" Text="Select Numbers" OnClick="SelectNumbers" runat="server" />
<br /><br />
<asp:Button ID="btnLetters" Text="Select Letters" OnClick="SelectLetters" runat="server" />
<br /><br />
<asp:PlaceHolder ID="phContent" runat="server" />
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Test : System.Web.UI.Page
{
protected void Page_Init(object sender, EventArgs e)
{
if (!IsPostBack)
HttpContext.Current.Session["control"] = "~/Controls/Numbers.ascx";
LoadControl();
}
protected void SelectNumbers(object sender, EventArgs e)
{
HttpContext.Current.Session["control"] = "~/Controls/Numbers.ascx";
LoadControl();
}
protected void SelectLetters(object sender, EventArgs e)
{
HttpContext.Current.Session["control"] = "~/Controls/Letters.ascx";
LoadControl();
}
private void LoadControl()
{
phContent.Controls.Clear();
var control = Page.LoadControl((String)HttpContext.Current.Session["control"]);
phContent.Controls.Add(control);
}
}
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Numbers.ascx.cs" Inherits="Numbers" %>
<asp:DropDownList ID="ddlSelectNumbers"
AutoPostBack="true" runat="server"
OnSelectedIndexChanged="SelectNumbers_IndexChanged" >
<asp:ListItem Text="One" Value="1" />
<asp:ListItem Text="Two" Value="2" />
<asp:ListItem Text="Three" Value="3" />
</asp:DropDownList>
<br /><br />
<asp:Label ID="lblSelectedNumber" runat="server" />
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using Superexpert.Controls;
public partial class Numbers : System.Web.UI.UserControl
{
public override String ID
{
get { return "Numbers"; }
set { }
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected void SelectNumbers_IndexChanged(object sender, EventArgs e)
{
lblSelectedNumber.Text = ((DropDownList)sender).SelectedItem.Text;
}
}
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Letters.ascx.cs" Inherits="Letters" %>
<asp:DropDownList ID="ddlSelectLetters"
AutoPostBack="true" runat="server"
OnSelectedIndexChanged="SelectLetters_IndexChanged" >
<asp:ListItem Text="A" Value="a" />
<asp:ListItem Text="B" Value="b" />
<asp:ListItem Text="C" Value="c" />
</asp:DropDownList>
<br /><br />
<asp:Label ID="lblSelectedLetter" runat="server" />
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using Superexpert.Controls;
public partial class Letters : System.Web.UI.UserControl
{
public override String ID
{
get { return "Letters"; }
set { }
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected void SelectLetters_IndexChanged(object sender, EventArgs e)
{
lblSelectedLetter.Text = ((DropDownList)sender).SelectedItem.Text;
}
}
第一个用户控件有一个下拉列表来选择数字。它具有如下标记:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="Test" %>
<!DOCTYPE html>
<html>
<head runat="server">
</head>
<body>
<form id="form1" runat="server">
<asp:Button ID="btnNumbers" Text="Select Numbers" OnClick="SelectNumbers" runat="server" />
<br /><br />
<asp:Button ID="btnLetters" Text="Select Letters" OnClick="SelectLetters" runat="server" />
<br /><br />
<asp:PlaceHolder ID="phContent" runat="server" />
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Test : System.Web.UI.Page
{
protected void Page_Init(object sender, EventArgs e)
{
if (!IsPostBack)
HttpContext.Current.Session["control"] = "~/Controls/Numbers.ascx";
LoadControl();
}
protected void SelectNumbers(object sender, EventArgs e)
{
HttpContext.Current.Session["control"] = "~/Controls/Numbers.ascx";
LoadControl();
}
protected void SelectLetters(object sender, EventArgs e)
{
HttpContext.Current.Session["control"] = "~/Controls/Letters.ascx";
LoadControl();
}
private void LoadControl()
{
phContent.Controls.Clear();
var control = Page.LoadControl((String)HttpContext.Current.Session["control"]);
phContent.Controls.Add(control);
}
}
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Numbers.ascx.cs" Inherits="Numbers" %>
<asp:DropDownList ID="ddlSelectNumbers"
AutoPostBack="true" runat="server"
OnSelectedIndexChanged="SelectNumbers_IndexChanged" >
<asp:ListItem Text="One" Value="1" />
<asp:ListItem Text="Two" Value="2" />
<asp:ListItem Text="Three" Value="3" />
</asp:DropDownList>
<br /><br />
<asp:Label ID="lblSelectedNumber" runat="server" />
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using Superexpert.Controls;
public partial class Numbers : System.Web.UI.UserControl
{
public override String ID
{
get { return "Numbers"; }
set { }
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected void SelectNumbers_IndexChanged(object sender, EventArgs e)
{
lblSelectedNumber.Text = ((DropDownList)sender).SelectedItem.Text;
}
}
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Letters.ascx.cs" Inherits="Letters" %>
<asp:DropDownList ID="ddlSelectLetters"
AutoPostBack="true" runat="server"
OnSelectedIndexChanged="SelectLetters_IndexChanged" >
<asp:ListItem Text="A" Value="a" />
<asp:ListItem Text="B" Value="b" />
<asp:ListItem Text="C" Value="c" />
</asp:DropDownList>
<br /><br />
<asp:Label ID="lblSelectedLetter" runat="server" />
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using Superexpert.Controls;
public partial class Letters : System.Web.UI.UserControl
{
public override String ID
{
get { return "Letters"; }
set { }
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected void SelectLetters_IndexChanged(object sender, EventArgs e)
{
lblSelectedLetter.Text = ((DropDownList)sender).SelectedItem.Text;
}
}
第二个用户控件有一个下拉列表来选择字母。它具有如下标记:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="Test" %>
<!DOCTYPE html>
<html>
<head runat="server">
</head>
<body>
<form id="form1" runat="server">
<asp:Button ID="btnNumbers" Text="Select Numbers" OnClick="SelectNumbers" runat="server" />
<br /><br />
<asp:Button ID="btnLetters" Text="Select Letters" OnClick="SelectLetters" runat="server" />
<br /><br />
<asp:PlaceHolder ID="phContent" runat="server" />
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Test : System.Web.UI.Page
{
protected void Page_Init(object sender, EventArgs e)
{
if (!IsPostBack)
HttpContext.Current.Session["control"] = "~/Controls/Numbers.ascx";
LoadControl();
}
protected void SelectNumbers(object sender, EventArgs e)
{
HttpContext.Current.Session["control"] = "~/Controls/Numbers.ascx";
LoadControl();
}
protected void SelectLetters(object sender, EventArgs e)
{
HttpContext.Current.Session["control"] = "~/Controls/Letters.ascx";
LoadControl();
}
private void LoadControl()
{
phContent.Controls.Clear();
var control = Page.LoadControl((String)HttpContext.Current.Session["control"]);
phContent.Controls.Add(control);
}
}
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Numbers.ascx.cs" Inherits="Numbers" %>
<asp:DropDownList ID="ddlSelectNumbers"
AutoPostBack="true" runat="server"
OnSelectedIndexChanged="SelectNumbers_IndexChanged" >
<asp:ListItem Text="One" Value="1" />
<asp:ListItem Text="Two" Value="2" />
<asp:ListItem Text="Three" Value="3" />
</asp:DropDownList>
<br /><br />
<asp:Label ID="lblSelectedNumber" runat="server" />
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using Superexpert.Controls;
public partial class Numbers : System.Web.UI.UserControl
{
public override String ID
{
get { return "Numbers"; }
set { }
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected void SelectNumbers_IndexChanged(object sender, EventArgs e)
{
lblSelectedNumber.Text = ((DropDownList)sender).SelectedItem.Text;
}
}
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Letters.ascx.cs" Inherits="Letters" %>
<asp:DropDownList ID="ddlSelectLetters"
AutoPostBack="true" runat="server"
OnSelectedIndexChanged="SelectLetters_IndexChanged" >
<asp:ListItem Text="A" Value="a" />
<asp:ListItem Text="B" Value="b" />
<asp:ListItem Text="C" Value="c" />
</asp:DropDownList>
<br /><br />
<asp:Label ID="lblSelectedLetter" runat="server" />
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using Superexpert.Controls;
public partial class Letters : System.Web.UI.UserControl
{
public override String ID
{
get { return "Letters"; }
set { }
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected void SelectLetters_IndexChanged(object sender, EventArgs e)
{
lblSelectedLetter.Text = ((DropDownList)sender).SelectedItem.Text;
}
}
当页面第一次加载(!IsPostBack)时,一切都正常。您可以从下拉列表中选择数字,它的SelectedItemChanged事件触发,它的SelectedValue更新,标签更新
当您单击其中一个按钮以动态加载其中一个用户控件时,就会出现此问题。之后,第一次从DropDownList中选择内容时,SelectedItemChanged事件不会触发,它的SelectedValue不会更新,因此标签不会更新。之后,一切正常
是什么导致了这种情况
提前谢谢 你很封闭。您只需要将ID分配给动态创建的控件 基本上,若要在回发时检索控件,需要将ID分配给动态创建的控件 请看3