如何从 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);
    }
}

但是,当我尝试迭代集合时,我没有得到任何返回,这导致我相信我错误地调用了控件或由于回发而被销毁。我应该使用另一个控件(如列表框控件)而不是将这些元素写入占位符?

有人可以就如何检索复选框值为我提供一些指导吗?

如何从 asp.net 中动态生成的复选框列表中获取复选框值

有两种思想流派;一,您需要重新创建为初始视图创建的控件层次结构,以便页面可以将视图状态和窗体值还原到控件树中,或者两个,您可以使用低技术解决方案,只需从窗体集合中获取值。

我个人喜欢选项二,它相对容易处理,而且看起来您已经在使用 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' 。检查了从操作到操作的状态。