DropDownLists, On Selected Index Изменено запускается только когда нажата другая кнопка - C#

По сути, я бы хотел, чтобы мой DropDownList обновлял назначенные ему номера в зависимости от того, какой сейчас месяц. (например, если кто-то выберет февраль, он обновит раскрывающийся список "День", чтобы ограничить количество отображаемых там чисел.).

Тем не менее, моя проблема заключается в том, что всякий раз, когда код запускается, он не обновляется при изменении месяца. Судя по моим контрольным точкам, он запускается только тогда, когда нажимается другая кнопка, находящаяся на странице, ТОГДА событие будет запущено. Это странная проблема, и я возился с ней безрезультатно.

Мой HTML для выпадающего списка:

<asp:DropDownList ID="ddlMonthCI" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlMonthCI_SelectedIndexChanged"/>

Возился с этим несколько раз, пытаясь EnableViewState="true" и несколько других мелких вещей, но ничего не помогло.

После нажатия этой кнопки код запускается:

<asp:Button runat="server" ID="CheckAvailability" Text="CHECK" OnClick="CheckAvailability_Click" CssClass="tsc_c3b_white tsc_button" />

Мой текущий код C#

 protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        FillDropDowns();
        ddlMonthCI_SelectedIndexChanged(sender, e);
    }
}

protected void FillDropDowns()
{
    //A new int array created to hold 31 numbers
    var x = System.DateTime.Now;
    //For every 'i' (day), starting at one, and less than 31, incremement.
    for (int i = 1; i < 32; i++)
    {
        ddlDayCI.Items.Add(i.ToString());
        ddlDayCO.Items.Add(i.ToString());
    }
    ddlDayCI.Items.FindByValue(x.Day.ToString()).Selected = true;
    ddlDayCO.Items.FindByValue(x.Day.ToString()).Selected = true;

    //A new array created to hold months of the year
    for (int i = 1; i < 13; i++)
    {
        ddlMonthCI.Items.Add(i.ToString());
        ddlMonthCO.Items.Add(i.ToString());
    }
    ddlMonthCI.Items.FindByValue(x.Month.ToString()).Selected = true;
    ddlMonthCO.Items.FindByValue(x.Month.ToString()).Selected = true;

    for (int i = x.Year; i <= (x.Year + 1); i++)
    {
        ddlYearCI.Items.Add(i.ToString());
        ddlYearCO.Items.Add(i.ToString());
    }
}

protected void ddlMonthCI_SelectedIndexChanged(object sender, EventArgs e)
{
    DateTime sysdate = DateTime.Now;
    int selectedYear = Convert.ToInt32(ddlYearCI.SelectedItem.Text);
    int selectedMonth = Convert.ToInt32(ddlMonthCI.SelectedItem.Text);
    int totaldaysinthismonth = System.DateTime.DaysInMonth(selectedYear, selectedMonth);

    ddlDayCI.Items.Clear();

    for (int i = 1; i <= totaldaysinthismonth; i++)
    {
        ddlDayCI.Items.Add(i.ToString());
    }
}

Я пропустил метод onClick для проверки доступности, потому что не вижу в этом необходимости. Однако, если вы хотите, чтобы я опубликовал это, я сделаю это.

В пределах загрузки страницы FillDropDowns(); метод запущен, как и ddlMonthCI_SelectedIndexChanged. Я поместил его туда, потому что он запускается только тогда, когда он запускается.

Есть идеи?

По запросу -

protected void CheckAvailability_Click(object sender, EventArgs e)
{
    int yearCI = Convert.ToInt32(ddlYearCI.SelectedItem.Value);
    int monthCI = Convert.ToInt32(ddlMonthCI.SelectedItem.Value);
    int dayCI = Convert.ToInt32(ddlDayCI.SelectedItem.Value);
    DateTime dateOfCheckIn = new DateTime(yearCI, monthCI, dayCI);

    int yearCO = Convert.ToInt32(ddlYearCO.SelectedItem.ToString());
    int monthCO = Convert.ToInt32(ddlMonthCO.SelectedItem.ToString());
    int dayCO = Convert.ToInt32(ddlDayCO.SelectedItem.ToString());
    DateTime dateOfCheckOut = new DateTime(yearCO, monthCO, dayCO);

    //If checking out is before checking in date
    if (dateOfCheckOut < dateOfCheckIn)
    {
        Page.ClientScript.RegisterStartupScript(this.GetType(),"Scripts","<script>alert('INCORRECT DATE FORMAT');</script>" );            
    }
    //If checking out is after checking in date
    else if (dateOfCheckOut > dateOfCheckIn)
    {
        //Finds the current systems date
        DateTime sysdate = DateTime.Now;
        //If the current system date is after the check in, or its after the check out
        if (sysdate > dateOfCheckIn || sysdate > dateOfCheckOut)
        {
            Page.ClientScript.RegisterStartupScript(this.GetType(), "Scripts", "<script>alert('Please book AFTER todays date');</script>");
        }
        //else it'll run this
        else
        {
            DLDbContext context = new DLDbContext();
            //Counts how many versions of that room exists
            var roomType = ddlRoomType.SelectedItem.ToString();
            int RoomTypes = (from u in context.Room where u.roomType == roomType select u).Count();
            //Counts how many booked rooms there is, with the same room type.
            int BookedRooms = (from b in context.Booking where b.arrivalDate >= dateOfCheckIn && b.departureDate <= dateOfCheckOut && b.RoomType == roomType select b).Count();

            //If there's less booked rooms, than the amount of Rooms of that type it'll run this
            if (BookedRooms < RoomTypes)
            {

                //Passes current dates of checking in, checking out and roomtype to booking page
                Session.Add("checkIn", dateOfCheckIn);
                Session.Add("checkOut", dateOfCheckOut);
                Session.Add("roomType", roomType);
                Response.Redirect("BookingOverview.aspx");
            }
            //Else run this
            else
            {
                //Unavailable
                Page.ClientScript.RegisterStartupScript(this.GetType(), "Scripts", "<script>alert('Date is unavailable');</script>");
            }
        }
    }
}

1 ответ

Решение

Я нашел свою ошибку. Я запустил тестовый сайт, чтобы подтвердить, что это не моя глупость (и был прав).

Ошибка возникла из шаблона пользовательского интерфейса, который я использовал, который состоял из

<form id="reservation-form">
   <form runat="server">
<!-- Stuff in here -->
</form>
</form>

Причиной проблемы была первая форма, я не знаю почему, я также не мог дать второй форме этот идентификатор для продолжения класса CSS, так как он не работает должным образом.

Однако после его удаления выпадающие списки работают правильно.

Другие вопросы по тегам