2017-06-06 10 views
0

私のドロップダウンリストコントロールは常にポストバックの最初の項目を返します。 気楽に、データのコンテナである2つのデータクラスがあります。 ConnectedRobots(コントローラのバージョン、IPアドレス、およびその他のプロパティを持つ接続されたロボットを表します)、およびMiseAJour(そのバージョンおよびそれを説明するいくつかの詳細が含まれています)。 これらの2つのクラスを使用して、接続された各ロボットまたは使用可能な更新を表すオブジェクトを作成します。次に、各ドロップダウンリストのデータソースとして使用する更新バージョンのリストを作成します。 下図に示すように:ドロップダウンリストは常にEnableViewStateがtrueに設定されている場合でも最初の値を返します

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サービスと複数のdynaを使用して更新バージョンと接続されたロボットの両方を取得するために使用されますmml生成されたxmlファイル selectedIndexChangedでは、選択した値を取得する必要があります。 SelectedValueは、常にドロップダウンリストの最初の要素を返します。私は間違って何をしていますか? 私は持っていますEnableViewState = "true"ポストバック間の持続性。 私はそれが全体のコードの再構築を意味していても、 はあなたの答えをありがとう、

答えて

0

だから私はほとんど非常識行く後に問題を解決し、変なふうに十分な問題は、(getMajDetailsとあった、回答のすべての種類に開いています)実装WebserviceRobotsでこのメソッドは、更新バージョンおよびその他の情報を含むXMLドキュメントを逆シリアル化し、これらの要素を含む文字列を|文字。 |

1940年7月1日\ rを\ n個:XDocumentは自動的にこの1のような文字列で、その結果、各要素の終わりに改行文字が追加されますようにしかし、それはそうです心配しているle MAJ 1.7 \ r \ n | Commentaires 1.7 \ r \ n || 2.0.2542 \ r \ n |懸念しているle MAJ 2.0 \ r \ n |コメント2.0 \ r \ n || 1.8.2495 \ r \ n |心配しているle MAJ 1.8 \ r \ n |コメント1.8 \ r \ n ||

したがって、各ListeVersionsMAJs要素は最後に\ r \ nで終わります。このリストを使用してdorpdownリストに値を設定すると、dorpdownリストは元のように動作します(各ポストバックで最初の値が返されます)。解決策は\ r \ nを削除することでした。 私はこれがなぜ起こっているのかについては説明していません。固定値の文字列値で初期化された文字列のリストをドロップダウンリストでテストし、各行の末尾に改行文字を入れて同じ奇妙な振る舞いになりました。 誰かがこれをクリアすることができれば、それは非常に感謝するでしょう。

関連する問題