即使EnableViewState设置为true,dropdownlist也始终返回第一个值

时间:2017-06-06 14:58:12

标签: asp.net drop-down-menu webforms autopostback ispostback

我的下拉列表控件总是返回回发的第一个项目,我已经尝试了我遇到的每个解决方案但无济于事。 基本上,我有两个数据类,它们只是数据的容器。 ConnectedRobots (表示已连接的机器人及其控制器的版本,IP地址和其他一些属性)和 MiseAJour (代表单个可用更新及其版本及其他一些描述它的详细信息) )。 然后,这两个类用于创建表示每个连接的机器人或可用更新的对象。然后我创建一个更新版本列表,将其用作每个下拉列表的数据源。 如下图所示:

Click to view

以下是反映此视图的代码段(Default.aspx):

 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplicationTest.WebForm1" Theme="Theme1"  EnableEventValidation="false" EnableViewState="true"%>

    ...
<body>
<form runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
...
<div style="width:100%;">
    <table class="table table-hover">
        <thead>
            <tr>
            <th class="auto-style1">Référence Robot/Version Contrôleur</th>
            <th class="auto-style1">Pays/Adresse IP</th>
            <th class="auto-style1">Etat</th>
            <th class="auto-style1">Versions des contrôleurs disponibles</th>
            <th class="auto-style1">Planification</th>
            <th>MAJ</th>
            </tr>
        </thead>
        <tbody>
            <asp:Repeater ID="repCRobots" runat="server" EnableViewState="true">
                <ItemTemplate>
                    <tr>
                    <td>
                        <asp:Label ID="lblReferenceRobot" runat="server" Text='<%# Eval("ReferenceRobot") + " / " %> ' />
                        <asp:Label ID="lblVersionControleur" runat="server" Font-Bold="true" Text='<%# Eval("VersionControleur") %>'/>
                    </td>
                    <td>
                        <asp:Label ID="lblPays" runat="server" Text='<%# Eval("Pays") + " / " %> ' />
                        <asp:Label ID="lblIPRobot" runat="server" Font-Bold="true" Text='<%# Eval("IPRobot") %>'/>
                    </td>
                    <td>
                        <asp:Label ID="lblEtat" runat="server" Font-Bold="true" Text='<%# Eval("Etat") %>'/>
                    </td>
                    <td>
                        <asp:DropDownList ID="VersionsMAJs" runat="server" CssClass="bg-primary" EnableViewState="true" OnSelectedIndexChanged="VersionsMAJs_SelectedIndexChanged" AutoPostBack="true"></asp:DropDownList>
                    </td>
                    <td>
                        <span style="padding: 0px 10px 10px 10px">
                        <cc1:TimeSelector ID="TimeSelector1" runat="server" DisplayButtons="false"  Font-Bold="true" BackColor="#cce6ff" BorderStyle="Dotted" CssClass="bg-info" BorderColor="White"></cc1:TimeSelector>
                        </span>
                     </td>
                     <td>
                         <asp:CheckBox ID='SelectMAJ' runat="server"/>
                         <asp:HiddenField ID="HiddenCheckBox" Value='<% #Eval("ReferenceRobot")%>' runat="server" />     
                     </td>
                     </tr>
                 </ItemTemplate>
             </asp:Repeater>
         </tbody>
     </table>

 <asp:Button ID="MAJButton" runat="server" Text="Mettre à jour" CssClass="btn btn-success btn-lg btn-block"/>
</div>

背后的代码如下:

public partial class WebForm1 : System.Web.UI.Page
{
    protected List<MiseAJour> ListeMAJs;
    protected List<string> ListeVersionsMAJs;
    protected List<ConnectedRobots> ListeRobotsConnectes; 
    protected List<string> ListeRefRobots;
    protected DropDownList ddlVersionMAJ;


    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {

            GetConnectedRobots();
            Repeater repCRobots = this.FindControl("repCRobots") as Repeater;
            repCRobots.DataSource = ListeRobotsConnectes;
            repCRobots.DataBind();
            foreach (RepeaterItem item in repCRobots.Items)
            {
                ddlVersionMAJ = item.FindControl("VersionsMAJs") as DropDownList;
                ddlVersionMAJ.DataSource = ListeVersionsMAJs; 
                ddlVersionMAJ.DataBind();
            }
        }

    }


    private void GetConnectedRobots()
    {
        WebserviceRobots ws = new WebserviceRobots();
        string[] delimiters = new string[] { "|", "||" };
        string connectedRobots = ws.getConnectedRobots();
        string majsDetails = ws.getMajsDetails();
        string[] connectedRobotsInfos = connectedRobots.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
        string[] majsInfos = majsDetails.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
        ListeRobotsConnectes = new List<ConnectedRobots>();
        ListeRefRobots = new List<string>();
        ListeMAJs = new List<MiseAJour>();
        ListeVersionsMAJs = new List<string>();

        for (int i = 0; i < majsInfos.Length - 1; i += 3)
        {
            ListeMAJs.Add(new MiseAJour() { VersionMAJ = majsInfos[i], DetailsMAJ = majsInfos[i + 1], Commentaires = majsInfos[i + 2] });
        }

        ListeVersionsMAJs = ListeMAJs.Select(v => v.VersionMAJ).ToList();

        for (int i = 0; i < connectedRobotsInfos.Length - 1; i += 5)
        {
            ListeRobotsConnectes.Add(new ConnectedRobots() { ReferenceRobot = connectedRobotsInfos[i], VersionControleur = connectedRobotsInfos[i + 1], IPRobot = connectedRobotsInfos[i + 2], Pays = connectedRobotsInfos[i + 3], Etat = connectedRobotsInfos[i + 4], VersionsMAJ = ListeVersionsMAJs });
        }

        ListeRefRobots = ListeRobotsConnectes.Select(r => r.ReferenceRobot).ToList();

    }

    protected void VersionsMAJs_SelectedIndexChanged(object sender, EventArgs e)
    {
        DropDownList dll = (DropDownList)sender;
        string test = dll.SelectedValue;
    }

GetConnectedRobots()方法用于检索更新版本和使用Web服务连接的机器人以及一对动态生成的xml文件。 在selectedIndexChanged上,我应该得到所选的值,所以我想。 SelectedValue始终返回下拉列表的第一个元素。我究竟做错了什么? 我确实有 EnableViewState =“true” ,以便在回发之间保持持久性。 我愿意接受各种答案,即使这意味着重组整个代码, 谢谢你的回答,

1 个答案:

答案 0 :(得分:0)

所以我几乎疯了之后解决了这个问题,问题很奇怪就是在WebserviceRobots中实现了getMajDetails()。此方法用于反序列化包含更新版本和一些其他信息的XML文档,并返回包含由 | 字符分隔的这些元素的字符串。但是,似乎XDocument会在每个元素的末尾自动添加新行字符,从而产生类似于此字符串的字符串:

1940年7月1日\ r \ N | Détails关注le MAJ 1.7 \ r \ n |评论1.7:r \ n || 2.0.2542 \ r \ n | Détails关注le MAJ 2.0 \ r \ n |评论2.0 \ r \ n || 1.8.2495 \ r \ n | Détails关注le MAJ 1.8 \ r \ n |评论1.8 \ r \ n ||

因此,每个ListeVersionsMAJs元素最后都以\ r \ n结尾。当此列表用于填充dorpdown列表时,它会使其行为方式(在每次回发时返回第一个值)。解决方案是删除 \ r \ n 。 我没有解释为什么会发生这种情况,用一个用固定字符串值初始化的字符串列表测试下拉列表,每个值末尾的新行字符导致相同的奇怪行为。 因此,如果有人能够清除这一点,那将非常感激。