网络窗体:引用动态控件

本文关键字:动态控件 引用 窗体 网络 | 更新日期: 2023-09-27 17:56:24

我有一个WebForms应用程序,可以在页面上生成动态选择元素。我不知道会出现多少,因为这是基于数据库中有多少条记录。下面是在Page_Load上执行的部分代码。

foreach (int studioId in studioIds)
            {
                DataRow studio = DAL.Database.Object_Get(Database.ObjectType.Studio, studioId).Rows[0];
                var studioName = studio["name"].ToString();
                string literal = string.Format("<div class='"form-group'">" +
                                                "<label for='"team_filter_{0}'" class='"col-md-3 control-label text-nowrap'">{1}</label>" +
                                                "<select id='"team_filter_{0}'" class='"col-md-9'" multiple='"true'">" +
                                                "<option value='"studio_{0}'" data-type='"studio'">All {1}</option>", studioId, studioName);
                // ...
                literal += "<optgroup label='"Games'">";
                literal += "<option value='"game_0'" data-type='"game'">All Games</option>";
                literal += "</optgroup>";
                literal += "</select>" +
                            "</div>";
                filterselectors.Controls.Add(new LiteralControl(literal));

如果您查看 select 元素,我会生成一个 id(即 team_filter_1、team_filter_2)并附加数据库记录的主键。

在同一页面上,我有一个按钮调用以下方法,该方法处理选择列表中的选中选项(我使用 Bootstrap 多选插件)。

private bool GenerateFinancialReport()
    {            
        HtmlSelect select = (HtmlSelect)Page.FindControl("team_filter_???");
        QueryDropDown(select, DAL.Database.ObjectType.Game, out games, out gameNames);
        // ...            
    }

有两个问题,我必须引用所有选择元素,但我不知道它们的 id。其次,我认为我不能使用 FindControl 方法,因为这不是服务器控件。我在上面对 FindControl 的调用中尝试硬编码"team_filter_1",但选择变量始终为空。

我还尝试在代码隐藏中使用服务器控件,如下所示,但我仍然遇到同样的问题。回发页面时,我无法引用代码隐藏中的下拉列表:

foreach (int studioId in studioIds)
            {
                DataRow studio = DAL.Database.Object_Get(Database.ObjectType.Studio, studioId).Rows[0];
                var studioName = studio["name"].ToString();
                // Start
                Panel formGroup = new Panel();
                formGroup.Attributes.Add("class", "form-group");
                Label label = new Label();
                label.Attributes.Add("for", "team_filter_" + studioId);
                label.Attributes.Add("class", "col-md-3 control-label text-nowrap");
                label.Text = studioName;
                HtmlSelect teamfilter = new HtmlSelect();
                teamfilter.ID = "team_filter_" + studioId;
                teamfilter.Attributes.Add("class", "col-md-9");
                teamfilter.Attributes.Add("multiple", "true");
                ListItem listItem = new ListItem("All " + studioName, "studio_" + studioId);
                listItem.Attributes.Add("data-type", "studio");
                teamfilter.Items.Add(listItem);
                listItem = new ListItem("All Games", "game_0");
                listItem.Attributes.Add("data-type", "game");
                teamfilter.Items.Add(listItem);
                formGroup.Controls.Add(label);
                formGroup.Controls.Add(teamfilter);
                filterselectors.Controls.Add(formGroup);

网络窗体:引用动态控件

您将在从服务器检索数据时遇到问题,特别是因为您没有使用服务器控件。我相信最好的(即最简单、最简单的)选择可能是通过 javascript 获取 ID,然后通过 ASP.NET Web API 控制器或将逗号分隔的 ID 列表粘贴到 ASP 隐藏输入字段中,将它们传递给服务器。

Javascript 抓取选项值并存储它们对于引导多选插件是这样的:

var selectedIDs = [];
var stringVal = '';
$('div.form-group ul.multiselect-container.dropdown-menu li.active').each(function(i){
    selectedIDs.push($(this).attr('value'));
});
stringVal = selectedIDs.join();
$('#myHiddenField').val(stringVal);