gpt4 book ai didi

c# - 更新面板触发时未保存复选框状态

转载 作者:太空宇宙 更新时间:2023-11-03 20:05:25 24 4
gpt4 key购买 nike

我有一个 div id = campaignDiv 并且我动态加载它的内容

内容是复选框。

我有一个每 30 秒触发一次的更新面板。

我的问题

当更新面板触发时,复选框返回到默认状态,即未选中。

我会给你我所有的代码。实际上这是非常简单的代码。 你可以在你的visual studio中复制粘贴它就可以了

WebForm4.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm4.aspx.cs" Inherits="TestDropdownChecklist.WebForm4" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<link rel="stylesheet" href="StyleSheet1.css"/>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Timer ID="Timer1" runat="server" OnTick="Timer1_Tick">
</asp:Timer>

<div id="campaignDiv" runat="server">
<ul>
</ul>
</div>

</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />
</Triggers>
</asp:UpdatePanel>
</form>
</body>
</html>

WebForm4.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace TestDropdownChecklist
{
public partial class WebForm4 : System.Web.UI.Page
{
private string CreateLiCheckbox(string checkBoxText)
{
return string.Format("<li><span class=\"textDropdown\">{0}</span><input runat=\"server\" id=\"{1}\" value=\"{0}\" type=\"checkbox\"><label for=\"{1}\"></label></li>", checkBoxText, checkBoxText + "dropdownID");
}

protected void Page_Load(object sender, EventArgs e)
{
int refreshtime = 30000;
Timer1.Interval = refreshtime;
if (!IsPostBack)
{
string[] comps = new string[] { "default", "sales", "direct"};
string html = "<ul>";
for (int i = 0; i < comps.Count(); i++)
{
html = html + CreateLiCheckbox(comps[i]);
}
html = html + "</ul>";
campaignDiv.InnerHtml = html;
}
else
{

}
}

protected void Timer1_Tick(object sender, EventArgs e)
{


}

}
}

StyleSheet1.css

#DropdownSeviceLink {
float: right;
margin-right: 10px;
}

a#DropdownServiceLink:visited {
color: inherit;
}

#campaignDiv {
background-color: #374954;
width: 200px;
height: 170px;
padding-bottom: 10px;
position: absolute;
top: 40px;
right: 0;
}

#campaignDiv ul {
color: #fff;
list-style: none;
overflow: auto;
padding-left: 5px;
height:100%;
}

#campaignDiv input[type=checkbox] {
visibility: hidden;
}

#campaignDiv input[type=checkbox]:checked + label {
left: 60px;
background: #26ca28;
}

#campaignDiv li {
width: 100px; /*120*/
height: 25px; /*40*/
background: #333;
margin: 13px 0px; /*20px 60px*/
border-radius: 50px;
position: relative;
}

#campaignDiv li:before {
content: 'On';
position: absolute;
top: 4px; /*12*/
left: 13px;
height: 2px;
color: #26ca28;
font-size: 16px;
}

#campaignDiv li:after {
content: 'Off';
position: absolute;
top: 4px; /*12*/
left: 71px; /*84*/
height: 2px;
color: #111;
font-size: 16px;
}

#campaignDiv li label {
display: block;
width: 36px; /*52*/
height: 18px; /*22*/
border-radius: 50px;
-webkit-transition: all .5s ease;
-moz-transition: all .5s ease;
-o-transition: all .5s ease;
-ms-transition: all .5s ease;
transition: all .5s ease;
cursor: pointer;
position: absolute;
top: 4px; /*9*/
z-index: 1;
left: 12px;
background: #ddd;
}





.textDropdown {
margin:0px;
padding:0px;
margin-left: 110px;

}

请注意我已经在使用runat server。也许我应该以另一种方式动态添加复选框?

编辑

通过互联网准备好后,我发现我可能需要像这样将复选框添加到我的更新面板UpdatePanel1.ContentTemplateContainer.Controls.Add(动态控件);但问题是我的复选框是字符串而不是对象。对吧?

非常感谢您的帮助。

为伟大的用户 Schadensbegrenzer 编辑

你的回答真的很有效,我thaaaaaaaaaaaaaank你,但请我仍然没有解决这个问题,你的代码制作了这个呈现的 html

<ul id="campaignDiv">   <li><input id="campaignDiv_0" type="checkbox" name="campaignDiv$0" checked="checked" value="default"><label for="campaignDiv_0">default</label></li>    <li><input id="campaignDiv_1" type="checkbox" name="campaignDiv$1" value="sales"><label for="campaignDiv_1">sales</label></li>  <li><input id="campaignDiv_2" type="checkbox" name="campaignDiv$2" value="direct"><label for="campaignDiv_2">direct</label></li>  </ul>

其中 campaignDiv 是 ul 的 ID。请您编辑您的答案,以便呈现的 html 可以是这样的:

<div id = campaignDiv>
<ul>
<li>
checkbox here
</li>
</ul>
</div>

在您的代码中,我将 campaginDiv 设置为 asp:CheckBoxList

的 id

最佳答案

首先,将 runat="server" 添加到您的 html 字符串在这里是没有意义的,因为它不会被服务器处理,而是按原样发送给客户端。

现在,您的更新面板将始终发出相同的内容,因为它是从 ViewState 重新填充的,如果您禁用更新面板 View 状态,则在下一次刷新时它将返回一个空面板(有没有可读取的 View 状态)

那么在这里做什么呢!您需要在回发时刷新更新面板内容,并手动读取客户端状态。

如果您确实担心 View 状态大小,请执行以下操作:

public partial class WebForm4 : System.Web.UI.Page
{
private string CreateLiCheckbox(string checkBoxText)
{
var checkState = !string.IsNullOrEmpty(Request.Form[string.Format("chk_{0}", checkBoxText)]) ? "checked=\"checked\"" : "";

return string.Format("<li><span class=\"textDropdown\">{0}</span><input id=\"{1}\" name=\"chk_{0}\" value=\"{0}\" type=\"checkbox\" {2}><label for=\"{1}\"></label></li>",
checkBoxText,
checkBoxText + "dropdownID",
checkState);
}
protected void Page_Load(object sender, EventArgs e)
{
int refreshtime = 5000;
Timer1.Interval = refreshtime;

if (!IsPostBack)
PopulateCheckboxes();
}
protected void Timer1_Tick(object sender, EventArgs e)
{
PopulateCheckboxes();
}
private void PopulateCheckboxes()
{
string[] comps = new string[] { "default", "sales", "direct" };
string html = "<ul>";
for (int i = 0; i < comps.Count(); i++)
{
html = html + CreateLiCheckbox(comps[i]);
}
html = html + "</ul>";
campaignDiv.InnerHtml = html;
}
}

关于c# - 更新面板触发时未保存复选框状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23854794/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com