我有一个带有ScriptManager控件的ASPX页面,一些LinkButton控件和一个PlaceHolder控件。每个LinkButton都会在PlaceHolder控件中添加(OnPageLoad)特定的用户控件。每个UserControl都有一个ScriptManagerProxy控件和一个UpdatePanel(UpdateMode = Conditional),它包含一些CheckBox(AutoPostback = true)控件和一个GridView。
问题是,当您单击CheckBox控件时,会检查它,但没有任何反应。当您再次单击它时,它将被取消选中,并导致整个页面的完整PostBack。随后单击CheckBox控件将按照应有的方式异步工作。
用户控制1:加价
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="UserControl1.ascx.cs" Inherits="UserControls_UserControl1" %>
<div>
<asp:ScriptManagerProxy ID="smp1" runat="server" />
<asp:UpdatePanel ID="up1" UpdateMode="Conditional" runat="server">
<ContentTemplate>
<h1>CheckBox Test 1</h1>
<asp:Panel ID="pnlOptions" runat="server" Visible="true">
<asp:Panel ID="pnlCheckTest1" runat="server">
<asp:CheckBox ID="chkCheckTest1"
AutoPostBack="true"
Text="Test 1"
OnCheckedChanged="chkCheckTest1_CheckChanged"
runat="server" />
</asp:Panel>
<asp:Panel ID="pnlCheckTest2" runat="server">
<asp:CheckBox ID="chkCheckTest2"
AutoPostBack="true"
Text="Test 2"
OnCheckedChanged="chkCheckTest2_CheckChanged"
runat="server" />
</asp:Panel>
</asp:Panel>
<br /><br />
<div>
<asp:Label ID="lblTestCheck1" runat="server" />
</div>
</ContentTemplate>
</asp:UpdatePanel>
</div>
用户控制1:代码
public partial class UserControls_UserControl1 : System.Web.UI.UserControl
{
protected void chkCheckTest1_CheckChanged(object sender, EventArgs e)
{
lblTestCheck1.Text = "Tiny";
}
protected void chkCheckTest2_CheckChanged(object sender, EventArgs e)
{
lblTestCheck1.Text = "Large";
}
}
用户控制2:加价
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="UserControl2.ascx.cs" Inherits="UserControls_UserControl2" %>
<div>
<asp:ScriptManagerProxy ID="smp1" runat="server" />
<asp:UpdatePanel ID="up1" UpdateMode="Conditional" runat="server">
<ContentTemplate>
<h1>CheckBox Test 2</h1>
<asp:Panel ID="pnlOptions" runat="server" Visible="true">
<asp:Panel ID="pnlCheckTest1" runat="server">
<asp:CheckBox ID="chkCheckTest1"
AutoPostBack="true"
Text="Test 1"
OnCheckedChanged="chkCheckTest1_CheckChanged"
runat="server" />
</asp:Panel>
<asp:Panel ID="pnlCheckTest2" runat="server">
<asp:CheckBox ID="chkCheckTest2"
AutoPostBack="true"
Text="Test 2"
OnCheckedChanged="chkCheckTest2_CheckChanged"
runat="server" />
</asp:Panel>
</asp:Panel>
<br /><br />
<div>
<asp:Label ID="lblTestCheck2" runat="server" />
</div>
</ContentTemplate>
</asp:UpdatePanel>
</div>
用户控制2:代码
public partial class UserControls_UserControl2 : System.Web.UI.UserControl
{
protected void chkCheckTest1_CheckChanged(object sender, EventArgs e)
{
lblTestCheck2.Text = "Small";
}
protected void chkCheckTest2_CheckChanged(object sender, EventArgs e)
{
lblTestCheck2.Text = "Big";
}
}
主页:加价
<%@ Page Title="" Language="C#" AutoEventWireup="true"CodeFile="CheckBoxTest.aspx.cs" Inherits="CheckBoxTest" %>
<html>
<head id="head1" runat="server">
<title>Check Box Test</title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="sm1" runat="server" />
<div id="Div1" runat="server">
<asp:LinkButton ID="lbCheckTest1" runat="server" Text="Check Test 1"
onclick="lbCheckTest1_Click" />
<br />
<asp:LinkButton ID="lbCheckTest2" runat="server" Text="Check Test 2"
onclick="lbCheckTest2_Click" />
</div>
<br /><br /><br /><br />
<div id="Div2" runat="server">
<asp:PlaceHolder
ID="phTable"
runat="server" />
</div>
</form>
</body>
</html>
主页:代码
public partial class CheckBoxTest : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Page.IsPostBack)
{
try
{
Control ctrl = LoadControl(Session["CurrentControl"] as String);
phTable.Controls.Add(ctrl);
}
catch
{
// ...
}
}
}
protected void lbCheckTest1_Click(object sender, EventArgs e)
{
Session["CurrentControl"] = "~/UserControls/UserControl1.ascx";
Control ctrl = LoadControl(Session["CurrentControl"] as String);
phTable.Controls.Clear();
phTable.Controls.Add(ctrl);
}
protected void lbCheckTest2_Click(object sender, EventArgs e)
{
Session["CurrentControl"] = "~/UserControls/UserControl2.ascx";
Control ctrl = LoadControl(Session["CurrentControl"] as String);
phTable.Controls.Clear();
phTable.Controls.Add(ctrl);
}
}
答案 0 :(得分:0)
试试这个
<asp:UpdatePanel runat="server"><%--your updatepanel--%>
<ContentTemplate>
<%--something that you want to update on checkbox check change event--%>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="your_checkbox_control_id" EventName="CheckedChanged" />
<%--add AsyncPostBackTrigger for checkbox event --%>
</Triggers>
</asp:UpdatePanel>
答案 1 :(得分:0)
事实证明这个问题与UpdatePanel无关。问题出在动态加载的用户控件上。
ViewState是动态加载控件的问题。最好在执行生命周期期间在OnPageInit事件期间加载它们。此外,为确保ViewState正常工作,请为控件分配有效的ID;
protected void Page_Init(object sender, EventArgs e)
{
if (Page.IsPostBack)
{
try
{
phTable.Controls.Clear();
Control ctrl = LoadControl(Session["CurrentControl"] as String);
ctrl.ID = Session["CurrentControlID"].ToString();
phTable.Controls.Add(ctrl);
}
catch
{
// Handle Error...
}
}
}
protected void lbCheckTest1_Click(object sender, EventArgs e)
{
Session["CurrentControl"] = "~/UserControls/UserControl1.ascx";
Session["CurrentControlID"] = "UserControl1";
Control ctrl = LoadControl(Session["CurrentControl"] as String);
ctrl.ID = Session["CurrentControlID"].ToString();
phTable.Controls.Clear();
phTable.Controls.Add(ctrl);
}