C# webforms:在updatepanel中使用infragistics webdropdown
供您参考(这是我最初的问题,多亏了康纳斯范才得以解决) 我的目标是拥有一个Infrastics dropdownlist来支持多重选择,在每次选择时,我都希望在不刷新整个页面的情况下使用事件触发的服务器端 这是我的aspx页面:C# webforms:在updatepanel中使用infragistics webdropdown,c#,asp.net,webforms,infragistics,C#,Asp.net,Webforms,Infragistics,供您参考(这是我最初的问题,多亏了康纳斯范才得以解决) 我的目标是拥有一个Infrastics dropdownlist来支持多重选择,在每次选择时,我都希望在不刷新整个页面的情况下使用事件触发的服务器端 这是我的aspx页面: <%@ Register assembly="Infragistics45.Web.v16.1, Version=16.1.20161.1000, Culture=neutral, PublicKeyToken=7dd5c3163f2cd0cb" namespac
<%@ Register assembly="Infragistics45.Web.v16.1, Version=16.1.20161.1000, Culture=neutral, PublicKeyToken=7dd5c3163f2cd0cb" namespace="Infragistics.Web.UI.ListControls" tagprefix="ig" %>
<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
<ig:WebDropDown ID="WebDropDown1" runat="server" Width="200px" OnSelectionChanged="WebDropDown1_SelectionChanged" EnableMultipleSelection="true" EnableClosingDropDownOnSelect="false" AutoPostBack="true">
</ig:WebDropDown>
<asp:UpdatePanel runat="server" UpdateMode="Conditional">
<Triggers>
<asp:AsyncPostBackTrigger ControlId="WebDropDown1" EventName="SelectionChanged"/>
</Triggers>
</asp:UpdatePanel>
这是我的代码隐藏页面:
private List<string> allPossiblechoices = new List<string>() { "a", "b", "c","d","e" };
private List<string> defaultChoices = new List<string>() { "a", "b", "c" };
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
foreach(var choice in allPossiblechoices)
{
WebDropDown1.Items.Add(
new DropDownItem()
{
Text = choice,
Value = choice,
Selected = defaultChoices.Contains(choice)
}
);
}
}
}
protected void WebDropDown1_SelectionChanged(object sender, DropDownSelectionChangedEventArgs e)
{
// I put a breakpoint here to see what e.NewSelection and e.OldSelection are
}
private List allPossiblechoices=new List(){“a”、“b”、“c”、“d”、“e”};
private List defaultChoices=新列表(){“a”、“b”、“c”};
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!this.IsPostBack)
{
foreach(所有可能的风险值选择)
{
WebDropDown1.Items.Add(
新的下拉项()
{
文本=选择,
价值=选择,
Selected=defaultChoices.Contains(选项)
}
);
}
}
}
受保护的无效WebDropDown1\u SelectionChanged(对象发件人,DropDownSelectionChangedEventArgs e)
{
//我在这里放了一个断点,看看e.NewSelection和e.OldSelection是什么
}
默认情况下,当第一次请求页面时,下拉列表由a、b、c、d、e组成,并且仅选择a、b、c
当我选择d时,确实会向服务器发送一个请求(我在事件处理程序中放置了一个断点),结果是正确的:
EventArgs e.OldSelection包含a、b、c.EventArgs e.NewSelection包含a、b、c、d 然后,我取消选择d,结果如下: EventArgs e.OldSelection包含a、b、c.d.
EventArgs e.NewSelection包含a、b、c、d 我不明白为什么EventArgs e.NewSelection包含d,即使我取消选择了它 更奇怪的是,我在没有updatePanel的情况下做了同样的事情,一切都很好,选择(新的和旧的)都是正确的
提前感谢您的帮助。您可以调用ScriptManager类的
RegisterStartupScript
静态方法来添加一些Javascript代码,以便在事件处理程序返回后执行。在下面的代码中,我假设UpdatePanel的ID是UpdatePanel1
protected void WebDropDown1_SelectionChanged(object sender, DropDownSelectionChangedEventArgs e)
{
WebDropDown wdd = sender as WebDropDown;
string scriptCode = string.Format("document.getElementById('{0}').openDropDown();", wdd.ClientID);
ScriptManager.RegisterStartupScript(UpdatePanel1, UpdatePanel1.GetType(), "WDDScript1", scriptCode, true);
}
如果它起作用,当面板更新时,您可能会看到WebDropDown关闭/打开(很遗憾)。您可以调用ScriptManager类的
RegisterStartupScript
静态方法,添加一些Javascript代码,以便在事件处理程序返回后执行。在下面的代码中,我假设UpdatePanel的ID是UpdatePanel1
protected void WebDropDown1_SelectionChanged(object sender, DropDownSelectionChangedEventArgs e)
{
WebDropDown wdd = sender as WebDropDown;
string scriptCode = string.Format("document.getElementById('{0}').openDropDown();", wdd.ClientID);
ScriptManager.RegisterStartupScript(UpdatePanel1, UpdatePanel1.GetType(), "WDDScript1", scriptCode, true);
}
如果它起作用,当面板更新时,您可能会看到WebDropDown关闭/打开(很不幸)。您是否尝试将
WebDropDown1
放入UpdatePanel?我不想将其放入,因为在WebDropDown1上的每个选择中,它都将关闭,因此在一次中执行多个选择的事实将丢失(即使使用属性EnableClosingDropDownOnSelect)根据以下文章,列表在回发时将始终关闭:。除非每次使用openDropDown
重新打开它(这将导致闪烁效果),您可能需要实现您在另一篇文章中首先考虑的客户端代码。目前,WebDropDown保持人为打开状态,因为它未包含在部分更新中。另一篇文章提供了一些关于如何使用客户端代码在WebDropDown中添加项的参考:。好的,谢谢,我将尝试使用解决方案是不是我没有进入原始问题:通过javascript添加的元素在进入服务器时不会持久化您是否尝试将WebDropDown1
放入UpdatePanel中?我不想将其放入,因为在WebDropDown1上的每个选择中,它都将被关闭,因此在一次中执行多个选择的事实将被忽略lost(即使使用属性EnableClosingDropDownOnSelect),根据以下文章,列表在回发时将始终关闭:。除非每次使用openDropDown
重新打开它(这将导致闪烁效果),您可能需要实现您在另一篇文章中首先考虑的客户端代码。目前,WebDropDown保持人为打开状态,因为它未包含在部分更新中。另一篇文章提供了一些关于如何使用客户端代码在WebDropDown中添加项的参考:。好的,谢谢,我将尝试使用解决方案是不是我没有遇到最初的问题:通过javascript添加的元素在进入服务器时不会持久化问题是每次刷新更新面板时都会执行我的代码。我希望只有当引发更新面板刷新的是dropdown1时才执行我的js代码,而不是dropdown2、3或触发updatePanel刷新的任何其他控件。您可以在公共事件处理程序中设置一个条件:if(sender==WebDropDown1){//Run script stuff here}
。否则,您可以将WebDropDown1\u SelectionChanged
设置为WebDropDown1
的事件处理程序,并为其他WebDropDown1控件设置另一个事件处理程序,将一些常用代码放在实用程序函数中。很抱歉,我不确定是否清楚,我是否需要将其放在客户端或服务器sid中e、 在我将这段代码添加到示例之前,我想知道:是同一个事件处理程序(WebDropDown1\u SelectionChanged
)附加到所有WebDropdown?如果是,是否有必要?如果事件处理程序仅附加到DropDown#1,则您会知道回发是由该下拉列表触发的。不,我有不同控件的不同处理程序,因此我需要知道哪一个触发updatepanel刷新。问题是,我的代码将在