2017-06-06 90 views
0

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

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服务和连接的动态连接的机器人mical生成的XML文件。 在selectedIndexChanged上,我应该得到选定的值,或者我想。 SelectedValue总是返回下拉列表的第一个元素。我究竟做错了什么? 我确实有EnableViewState =“true”用于回发之间的持久性。 我愿意接受各种答案,即使这意味着重组整个代码, 谢谢您的解答,

回答

0

所以我解决了问题后,几乎要疯了,这个问题古怪足够用getMajDetails()来实现在WebserviceRobots中。此方法用于对包含更新版本和其他信息的XML文档进行反序列化,并返回一个字符串,其中包含这些元素,分别为|字符。然而,这似乎是在的XDocument每个单元结束时自动添加新行焦炭,导致​​类似这样的字符串:

1940年7月1日\ r \ n |详情请咨询MAJ 1.7 \ r \ n |评论1.7 \ r \ n || 2.0.2542 \ r \ n |详情请咨询MAJ 2.0 \ r \ n | Commentaires 2.0 \ r \ n || 1.8.2495 \ r \ n |详情请咨询MAJ 1.8 \ r \ n |评论1.8 \ r \ n ||

因此,每个ListeVersionsMAJs元件在端部\ r \ n结束。并且当这个列表被用来填充这个dorpdown列表时,它会引起它的行为(在每个回发中返回第一个值)。解决方案是删除\ r \ n。 我没有解释为什么会发生这种情况,在每个值的末尾使用带有固定字符串值的新字符串初始化的字符串列表测试下拉列表导致了相同的奇怪行为。因此,如果任何人都可以清楚这一点,它将非常感激。

相关问题