2015-06-15 6 views
0

У меня есть приложение WebForms, которое создает на странице элементы динамического выбора. Я не знаю, сколько будет отображаться, потому что это зависит от количества записей в базе данных. Вот часть кода, который выполняется на странице_Load.WebForms: Справочное динамическое управление

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)); 

Если вы посмотрите на элемент выбора, сгенерировать идентификатор (т.е. team_filter_1, team_filter_2) и добавить первичный ключ записи базы данных.

На этой же странице у меня есть кнопка, которая вызывает следующий метод, который обрабатывает проверенные параметры из списка выбора (я использую плагин Multiselect для Bootstrap).

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

     // ...    
    } 

У меня есть две проблемы, я должен ссылаться на все отдельные элементы, но я не знаю их идентификаторы. Во-вторых, я не думаю, что могу использовать метод FindControl, поскольку это не серверный элемент управления. Я попробовал жесткое кодирование «team_filter_1» в моем вызове FindControl, но переменная выбора всегда равна нулю.

Я также попытался использовать серверные элементы управления в коде, как показано ниже, но у меня по-прежнему возникает та же проблема. Я не могу ссылаться на выпадающие списки в отделенного кода, когда страница размещена назад:

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); 
+0

«Я не думаю, что я могу использовать метод FindControl, так как это не является элемент управления сервером.» Почему вы не используете (динамически создавать) серверные элементы управления? –

+0

@ Возможно, вы просмотрели документацию вообще и пример в MSDN для 'HTMLSelect' [msdn HtmlSelect] (https://msdn.microsoft.com/en-us/library/system.web.ui.htmlcontrols.htmlвыбрать (v = vs.110) .aspx) – MethodMan

+0

Я думал об использовании серверного элемента управления, но я не знаю, как его поместить в div .form-group, как в коде выше. – Ray

ответ

1

Вы собираетесь иметь проблемы с извлечением данных с сервера, тем более, что вы не используете сервер управления. Я считаю, что лучшие (т. Е. Самые простые, простые) варианты, вероятно, состоят в том, чтобы захватить идентификаторы с помощью javascript, а затем передать их на сервер через контроллер веб-API ASP.NET или вставив список идентификаторов, разделенных запятыми, в ASP скрытое поле ввода.

Javascript, чтобы захватить значение параметров и сохранить их было бы что-то подобное для начальной загрузки MULTISELECT плагина:

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); 
+0

Я решил пойти с этим ответом, поскольку это имело для меня больше смысла. Тем не менее, я был вынужден поставить свой выше код в Page_Init, чтобы элементы управления не исчезали при обратной передаче. Единственная проблема, я имею в том, что флажки очищаются при обратной передаче. Кажется, я теряю эту информацию, когда пользователь проверяет что-то и сообщения. – Ray

Смежные вопросы