下拉列表总是 returns 第一个值,即使 EnableViewState 设置为 true
dropdownlist always returns first value even with EnableViewState set to true
我的下拉列表控件总是 returns 回发时的第一项,我已经尝试了我遇到的所有解决方案,但无济于事。
基本上,我有两个数据 类,它们只是数据的容器。
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 总是 returns 下拉列表的第一个元素。我究竟做错了什么?
我确实有 EnableViewState="true" 用于回发之间的持久性。
我对各种答案持开放态度,即使这意味着重构整个代码,
谢谢你的回答,
所以我在几乎发疯之后解决了这个问题,问题很奇怪是在 WebserviceRobots 中实现的 getMajDetails()。此方法用于反序列化包含更新版本和一些其他信息的 XML 文档,以及 return 一个字符串,其中这些元素由 | 字符分隔。但是,似乎 XDocument 会自动在每个元素的末尾添加 new line 字符,从而产生类似于以下的字符串:
1.7.1940\r\n|有关 MAJ 1 的详细信息。7\r\n|评论 1.7\r\n||2.0.2542\r\n|有关 MAJ 2 的详细信息。0\r\n|评论 2.0\r\n||1.8.2495\r\n|有关 MAJ 1 的详细信息。8\r\n|评论 1.8\r\n||
因此,每个 ListeVersionsMAJs 元素都以 \r\n 结尾。并且当此列表用于填充 dorpdown 列表时,它会导致它按照原来的方式运行(return 在每次回发时输入第一个值)。解决方案是删除 \r\n 。
我没有解释为什么会发生这种情况,使用用固定字符串值初始化的字符串列表测试下拉列表,每个值的末尾都有换行字符,导致相同的奇怪行为。
因此,如果有人能解决这个问题,我们将不胜感激。
我的下拉列表控件总是 returns 回发时的第一项,我已经尝试了我遇到的所有解决方案,但无济于事。 基本上,我有两个数据 类,它们只是数据的容器。 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 总是 returns 下拉列表的第一个元素。我究竟做错了什么? 我确实有 EnableViewState="true" 用于回发之间的持久性。 我对各种答案持开放态度,即使这意味着重构整个代码, 谢谢你的回答,
所以我在几乎发疯之后解决了这个问题,问题很奇怪是在 WebserviceRobots 中实现的 getMajDetails()。此方法用于反序列化包含更新版本和一些其他信息的 XML 文档,以及 return 一个字符串,其中这些元素由 | 字符分隔。但是,似乎 XDocument 会自动在每个元素的末尾添加 new line 字符,从而产生类似于以下的字符串:
1.7.1940\r\n|有关 MAJ 1 的详细信息。7\r\n|评论 1.7\r\n||2.0.2542\r\n|有关 MAJ 2 的详细信息。0\r\n|评论 2.0\r\n||1.8.2495\r\n|有关 MAJ 1 的详细信息。8\r\n|评论 1.8\r\n||
因此,每个 ListeVersionsMAJs 元素都以 \r\n 结尾。并且当此列表用于填充 dorpdown 列表时,它会导致它按照原来的方式运行(return 在每次回发时输入第一个值)。解决方案是删除 \r\n 。 我没有解释为什么会发生这种情况,使用用固定字符串值初始化的字符串列表测试下拉列表,每个值的末尾都有换行字符,导致相同的奇怪行为。 因此,如果有人能解决这个问题,我们将不胜感激。