0

我的问题是代码隐藏看起来像它工作并且根据调试器,它确实(没有错误或异常)。不幸的是,它实际上不适用于我的 asp.net webforms 网页,DropdownList 实际上并没有填充 ListBox 的选定项目。这真的应该很简单,但显然不是。

我的研究表明,Listboxes 和 DropDownList 应该在 UpdatePanels 内部,并且作为触发器的子项需要设置为 true,并且在 ScriptManager 的帮助下,它会拦截回发请求并仅执行部分页面更新。然而,当这不起作用时,我尝试直接调用 updatepanels.update() 方法,但这也不起作用。

这是我的 C# 代码。

  protected void GroupList_SelectedIndexChanged(object sender, EventArgs e)
    {
        updategroupEntry();
    }

    protected void updategroupEntry() 
    {
        EnterAGroup.Items.Clear();
        foreach (ListItem li in GroupList.Items)
        {
            if (li.Selected)
            {
                EnterAGroup.Items.Add(li);
            }
        }
        OptionsUpdater.Update();
        OverallUpdater.Update();
    }

在我的代码中,我使用了嵌套更新面板,此处显示了整体/周围的面板,我还在第二个 DropdownList 中包含了该面板的结束标签。这是第一个代码段。

<asp:UpdatePanel ID="OverallUpdater" UpdateMode="Conditional" runat="server" ChildrenAsTriggers="true">
       <ContentTemplate>

 //irrelevant code omitted

                <asp:Listbox AutoPostback="True" ID="GroupList" runat="server" Width="166px"  SelectionMode="Multiple" OnSelectedIndexChanged="GroupList_SelectedIndexChanged" DataSourceID="GroupSource" DataTextField="GroupName" DataValueField="GroupID">
                </asp:Listbox>
                <asp:SqlDataSource ID="GroupSource" runat="server"
                     ConnectionString="<%$ ConnectionStrings:ACESConnectionString %>" 
                    SelectCommand="SELECT [GroupName], [GroupID] FROM [PrimaryGroup] ORDER BY [GroupName]"></asp:SqlDataSource>

 //more code omitted

              <%--End of Options Panel --%>
                    </asp:Panel>
                </ContentTemplate>
              </asp:UpdatePanel> 

        </ContentTemplate>
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="viewapps" EventName="Click" />
            <asp:AsyncPostBackTrigger ControlID="UpdateButton" EventName="Click" />
            <asp:AsyncPostBackTrigger ControlID="FilterButton" EventName="Click" />
        </Triggers>
    </asp:UpdatePanel>  

在我的 aspx 页面中,我的 DropDownList 周围有这段代码。

    <asp:UpdatePanel ID="OptionsUpdater" UpdateMode="Conditional" runat="server"  ChildrenAsTriggers="true" ViewStateMode="Enabled"> 
       <ContentTemplate>

  //other code omitted for brevity.

          <asp:TableCell>
             <asp:DropDownList runat="server" ID="EnterAGroup" BackColor="PaleVioletRed" AutoPostBack="true"></asp:DropDownList>
          </asp:TableCell>

 //other code omitted for brevity.

    </ContentTemplate>
 </asp:UpdatePanel> 

所以代码隐藏说它的作品,但它只是没有在网页上更新。如何让它正常工作?

我很乐意根据要求提供更多代码。此外,如果您需要测试代码,我建议您用某个表中的 2 列替换您自己的 SqlDataSource。

更新 我已经尝试过 Cherian M Paul 的想法,它产生了奇怪的结果,当我从组中选择所有项目但不仅仅是少数项目时,它只能中途工作。

选择所有组时,这是中途工作。

选择所有组时工作中途

这是仅选择一些时它不起作用的图像。 仅选择一些时不起作用

更新

经过进一步调查,有一点断开连接,网页上的点击不再到达代码隐藏。

我有这个断线的视频。基本上,最后没有多少点击会触发我的代码隐藏中的事件。

https://docs.google.com/file/d/0B12ZVcp_VQ_xR3c0cU1LaXd5Vkk/edit?usp=sharing

4

2 回答 2

1

我相信,您需要为 ID 为的第二个 UpdatePanel 添加触发器OptionsUpdater。类似于您对第一个所做的方式。

<asp:AsyncPostBackTrigger ControlID="GroupList" EventName="GroupList_SelectedIndexChanged" />

请尝试更新 html。也没有部分更新,在使用更新面板的同时,asp.net实际上做了所有的工作,但只有部分页面被更新,用户感觉它在后端做一些事情。

我可以建议你使用 jQuery 来完成这些任务吗?

于 2013-08-16T17:01:31.287 回答
0
foreach (ListItem li in GroupList.Items)
{
    if (li.Selected)
    {
        EnterAGroup.Items.Add(li);
    }
}

上面的代码将不起作用,因为下拉列表不能有多个选定的项目。请按以下方式更改代码,然后它将起作用。

foreach (ListItem li in GroupList.Items)
{
    if (li.Selected)
    {
        EnterAGroup.Items.Add(new ListItem(li.Text, li.Value));
    }
}
于 2013-08-16T18:08:27.640 回答