如何从 asp.net 中动态生成的复选框列表中获取复选框值
本文关键字:复选框 列表 获取 动态 asp net | 更新日期: 2023-09-27 18:31:23
在Web表单中,我正在动态创建一系列添加到asp:占位符中的支票框
//Generates the List of Entities that may be shared
protected void GenerateEntityList(string agencyId, string agencyName)
{
var selectedAgency = UserFactory.GetAgencyAndSharedDataById(Convert.ToInt64(agencyId));
entityContainer.Controls.Clear();
//builds the entity list based upon entities in DB
var currentEntities = UserFactory.GetEntityList();
//add checkboxes
entityContainer.Controls.Add(new LiteralControl("<input type='checkbox' id='selectAllCB' value='All'>Select All<br/><br/>"));
foreach (var item in currentEntities)
{
CheckBox entityCheckBox = new CheckBox();
int currentItem = item.EntityTypeId.GetValueOrDefault(0);
entityCheckBox.Text = item.EntityName.ToString();
entityCheckBox.CssClass = "am_Checkbox";
entityContainer.Controls.Add(entityCheckBox);
entityContainer.Controls.Add(new LiteralControl("<br/><br/>"));
//mark checkboxes as checked if currently stored in the database
if (selectedAgency.FirstOrDefault().SecurityDataShares != null && selectedAgency.FirstOrDefault().SecurityDataShares.Count > 0)
{
foreach (var ce in selectedAgency.FirstOrDefault().SecurityDataShares)
{
if (ce.EntityId == item.EntityId)
{
entityCheckBox.Checked = true;
}
}
}
}
创建后,用户可以进行或删除选择。单击更新时,我想从复选框中返回/收集值,以便我可以将它们插入回数据库中。
//get the text value of every checkbox
protected void updateEnties()
{
string receivingAgency = ReceivingAgencyID;
long contributingAgency = QueryID;
List<string> cbValues = new List<string>();
foreach (CheckBox currentItem in entityContainer.Controls)
{
cbValues.Add(currentItem.Text);
}
}
但是,当我尝试迭代集合时,我没有得到任何返回,这导致我相信我错误地调用了控件或由于回发而被销毁。我应该使用另一个控件(如列表框控件)而不是将这些元素写入占位符?
有人可以就如何检索复选框值为我提供一些指导吗?
有两种思想流派;一,您需要重新创建为初始视图创建的控件层次结构,以便页面可以将视图状态和窗体值还原到控件树中,或者两个,您可以使用低技术解决方案,只需从窗体集合中获取值。
我个人喜欢选项二,它相对容易处理,而且看起来您已经在使用 LiteralControl
手动创建 HTML.只需提供一个在手动创建的输入标签之间共享的name
属性(为简洁起见,此处显示的示例,这可能不是您要做的):
entityContainer.Controls.Add(new LiteralControl("<input type='checkbox' name='mySharedName' />");
然后,要获取值,它就像这样简单:
var selectedValues = Request.Form["mySharedName"];
// This is now a comma separated list of values that was checked
这样,您就不必担心控制树状态。
让生活更轻松,只需改用CheckBoxList
,并将你的结果集绑定到它。这实际上将消除对任何动态内容的需求。
<asp:CheckBoxList ID="CheckList1" runat="server" DataTextField="TextColumn" DataValueField="ValueColumn" ...>
如果这不是一个选项,则需要在每次回发后重新创建控件。有几种方法可以做到这一点。
简单的方法
查看 DynamicControlsPlaceHolder 控件。这是一个有用的小控件,负责在后台保留动态内容。我建议使用此选项,因为它消除了动态创建内容的所有痛苦。
手动方式
在OnInit
期间重新创建控件。只需确保为控件分配相同的 ID,以便 ViewState 可以重新填充选择:
protected override void OnInit(EventArgs e)
{
var chk = new CheckBox { ID = "chkBox1" };
PlaceHolder1.Controls.Add(chk);
base.OnInit(e);
}
在回发后重新创建控件后,您应该能够访问如下所示的值:
foreach (CheckBox chk in PlaceHolder1.Controls.OfType<CheckBox>())
{
if (chk.Checked)
{
}
}
感谢大家的建议。根据如何实现这一点,我把答案归功于 Tejs,因为他让我走上了这个解决方案的思维路径。 在这个项目中,我需要使用复选框而不是复选框列表控件,因为我如何构建列表和验证选中的元素。挑战在于 asp.net 如何生成复选框控件,以及它允许向控件插入属性(名称、值等)的限制
因此,为了从代码生成的复选框中捕获vales,我做了以下操作:
在 aspx 文件中,我添加了一个隐藏的输入字段并分配了一个 runat=server 标记
<input id="cbEntityList" type="hidden" runat="server" value="" />
Tejs 解决方案与此类似,但我不喜欢为每个复选框添加一个隐藏字段的想法,因为这似乎在页面中有很多元素。
然后,我修改了复选框代码生成部分,以包含来自对象的唯一标识符作为 Id。ID 在 html 中作为 name 属性呈现,因此这允许我如何使用 javascript/jQuery 检索一些东西
因此,在我将构建复选框的 foreach 语句中,我添加了以下行
entityCheckBox.ID = item.EntityId.ToString();
最后,我使用 jQuery 迭代页面中的复选框,并返回一个仅选中项的字符串数组。
这将根据选中的复选框填充回隐藏字段,例如 (0,1,2,3,4)。
$('#btnUpdateEntities').click(function (event) {
var fields;
$(':checkbox:checked').each(function () {
var txt = $("input[name='cbEntityList']");
fields = ($(':checkbox:checked').map(function () {
return this.name;
}).get().join(","));
$(txt).val(fields);
});
});
然后,我可以在代码后面访问值数组,如下所示:
string voo = cbEntityList.Value;
希望这对任何感兴趣的人有所帮助。
你应该使用OO原则将实现放在一起的事情。 在这种情况下,您可能应该构建自己的 CheckBoxCollection(从正确的接口/类继承)。 它将简化代码并使其更加分区和可扩展。
然后,实现细节之一是处理您描述的情况:放入一个添加到视图状态/会话/任何内容的点击处理程序,您应该能够一目了然地看到您的测试工具/用户已检查/取消选中的任何内容。
另一个快速点:你不应该再使用
标签进行布局,特别是如果你已经在使用 CSS。 您可以确保复选框是您需要的任何显示类型(在本例中为 block?),然后在已用于修饰控件的 CSS 类中设置该类型。
tl;dr:我没有时间在代码中抛出一个示例,但基本的想法是你应该有一个 CheckBoxCollection(),它(根据您的偏好)保留它的 CheckBox()s' 。检查了从操作到操作的状态。