#c# #asp.net #.net #vb.net
#c# #asp.net #.net #vb.net
Вопрос:
Возможно ли добавить a DropDownList
внутри календарного дня для asp.net Calendar
контролировать, а затем привязать его к SelectedIndexChanged
событию?
Я могу добавить DropDownList
внутри день, который я хочу, но я не смог привязать его к событию. Я видел, как это делалось для a LinkButton
внутри Calendar
элемента управления, но ничего для a DropDownList
.
Комментарии:
1. Событие на стороне сервера или клиента?
2. Событие на стороне сервера — это то, чего я пытаюсь достичь.
3. В дополнение к ссылке, которую я предоставил в своем ответе ниже, если это соответствует вашим потребностям, вы можете рассмотреть возможность использования события на стороне клиента для запуска некоторого AJAX. В зависимости от того, что вы хотите на самом деле делать на сервере, это может улучшить пользовательский интерфейс.
4. @stillsmallvoice — просто интересно, что вы с этим сделали?
5. Спасибо, Джон. Итак, в основном, в моем календаре есть два выпадающих списка и кнопка linkbutton для выбранного дня. После того, как пользователь выберет свои параметры, он может нажать кнопку сохранения linkbutton, используя статью ниже этого ответа, чтобы отобразить событие. Затем я использовал страницу. Запрос. Параметры. getValues(«ddlSample»)[0]; чтобы получить значение из выпадающего списка в событии кнопки ссылки. Совсем не идеально, но это работает. Было бы немного лучше, если бы мне не нужна была кнопка linkbutton, и я мог бы просто сделать это через событие изменения выбранного индекса.
Ответ №1:
вы также можете сделать это таким образом. перенесите ваши данные в одну объектную переменную, а затем преобразуйте ее данные в тег выбора (тег выпадающего списка в html), а затем добавьте этот элемент управления в свой день календаря.
protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
stringBuilder matrix = new stringBuilder();
var SemList = (from row in dt.AsEnumerable()
select new
{
SemName = row.Field<string>("SemName"),
SemID = row.Field<string>("SemID")
});
if (SemList != null)
{
Matrix.Append("<select ID='sem_" dt.Rows[k]["ActualCMID"].ToString() "' runat='server' width='100px' onchange='" Server.HtmlEncode("javascript:BindSpecialization('" dv.ToTable().Rows[k]["ActualCMID"].ToString() "')").ToString() "'>");
Matrix.Append("<option value='0'>---Select---</option>");
foreach (var sem in SemList)
{
Matrix.Append("<option value='" sem.SemID "'>" sem.SemName "</option>");
}
Matrix.Append("</select>");
}
e.Cell.Controls.Add(new LiteralControl(Matrix.ToString()));
}
Я надеюсь, что это будет полезно для вас.
Ответ №2:
Интересно. Я не знал об этом ограничении, но нашел обходной путь, который включает использование обработки событий на стороне клиента. По словам автора, это включает в себя 1) Добавление статического элемента управления в событие dayRender; 2) Заставить его вести себя как динамический элемент управления с событиями; 3) Передать данные, чтобы определить, какая кнопка была нажата.
Вот ссылка: http://www.aarongoldenthal.com/post/2009/03/31/Create-Dynamic-Buttons-in-an-ASPNET-Calendar.aspx
В приведенном им примере используется кнопка LinkButton, но ее не должно быть сложно изменить для выпадающего элемента управления.
Комментарии:
1. Спасибо, это хорошая статья, и она действительно работает. Из статьи он устанавливает ссылку. NavigateUrl для обратной привязки к событию, что бы вы использовали для события выпадающего списка onselectedchange? Я пробовал добавлять атрибуты, добавляя событие selectedchange, но не могу заставить его работать.
2. @user —
onchange
в этом случае вы бы добавили событие. потому что при изменении срабатывает, когда значение выбирается из выпадающего списка.3. Именно то, что сказал @JonH. Вы должны использовать скрипт на стороне клиента, чтобы запустить обратную отправку. Вы не сможете подключиться к стороне сервера OnSelectedChanged таким образом, но именно поэтому они называются обходными путями.
Ответ №3:
Конечно, возможно, я написал статьи об imagebuttons и linkbuttons, следуйте той же форме здесь: http://weblogs.sqlteam.com/jhermiz/archive/2007/12/10/Cool-Tricks-With-The-ASP.net-Calendar.aspx
Когда вы пишете свое событие, вам просто нужно указать Handle
это событие.
Редактировать
Подумав об этом еще немного, на самом деле это может быть невозможно из-за того, как asp.net функции жизненного цикла и то, как он обрабатывает DayRender
событие.
Даже если вы что-то сделаете для этого:
protected void Calendar1_Render(object sender, DayRenderEventArgs e)
{
if (e.Day.IsWeekend)
{
DropDownList d = new DropDownList();
d.ID = "bah" e.Day.Date.ToShortDateString();
d.AutoPostBack = true;
d.SelectedIndexChanged = new EventHandler(DropDownList1_SelectedIndexChanged);
d.Items.Add("A");
d.Items.Add("B");
d.Items.Add("C");
e.Cell.Controls.Add(d);
}
}
Это не сработает, поскольку событие загрузки страницы уже запущено к моменту отображения каждого дня, поэтому даже настройка Autopostback=true
не будет работать.
Кроме того, даже если вы назначите новый EventHandler
для динамического элемента управления, он не будет работать, как в этом случае:
d.SelectedIndexChanged = new EventHandler(yourMethod);
Единственное, что я могу придумать, что может сработать, это что-то в этом роде:
protected void Calendar1_Render(object sender, DayRenderEventArgs e)
{
if (e.Day.IsWeekend)
{
DropDownList d = new DropDownList();
d.ID = "bah" e.Day.Date.ToShortDateString();
d.Items.Add("A");
d.Items.Add("B");
d.Items.Add("C");
d.Attributes.Add("onchange", "__doPostBack();");
e.Cell.Controls.Add(d);
}
}
Проблема в том, что это не запускает событие вашего сервера, оно только отправляет сообщение обратно, но это дает вам представление о том, что оно может запускать его с помощью некоторых атрибутов и сценариев на стороне клиента. Не могли бы вы изменить свой серверный метод на клиентский метод? Если это сработает, вы бы __doPostBack()
заменили его именем вашего метода на стороне клиента.
К сожалению, я не ASP.net эксперт, я упоминаю слишком много других вещей, но эта информация довольно достоверна, когда дело доходит до управления календарем, я часто использовал его в прошлом и дошел до того, что мне пришлось прекратить его использование из-за его ограничений.
Удачи.
Комментарии:
1. Спасибо за ответ! Я действительно использовал статью, которую вы опубликовали в прошлом, отличный материал. Проблема в том, что сообщение касается изображений или литералов, я не видел хорошей статьи о том, как точно указать событие дескриптора в элементе управления календарем. В документации MSDN говорится: поскольку событие dayRender вызывается во время отображения элемента управления Календарем, вы не можете добавить элемент управления, который также может вызывать событие, например LinkButton . Вы можете добавлять только статические элементы управления, такие как System.Web.UI.LiteralControl, метка, изображение и гиперссылка. Я уверен, что есть способ обойти это, я просто не могу понять это.
2. @user — в моей статье элементы управления, которые я добавляю, на самом деле являются кнопками изображений, которые могут вызывать обратную отправку, поэтому я не уверен, на какой MSDN вы ссылаетесь.
3. Привет, Джон, это ссылка на статью MSDN . Я снова просмотрел ваши статьи, но я не совсем понял, что я пытаюсь сделать. Несмотря на то, что я настраиваю обработчик событий для выпадающего списка, он уничтожается во время цикла страницы, и я не уверен, как это сделать правильно