Выпадающий список внутри элемента управления календарем Asp.net Управление календарем

#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 . Я снова просмотрел ваши статьи, но я не совсем понял, что я пытаюсь сделать. Несмотря на то, что я настраиваю обработчик событий для выпадающего списка, он уничтожается во время цикла страницы, и я не уверен, как это сделать правильно