簡體   English   中英

C# - 如果選定的日歷日期相同,則清除它

[英]C# - Clear selected calendar date if it is the same

我的 C# 代碼中有一個日歷,如果我單擊同一日期,我希望取消選擇某個日期。 怎么做?

protected void SelectionChangeCalendar(Object sender, EventArgs e){

   selected_date = Calendar1.SelectedDate.ToShortDateString();

   if(same date is clicked){
      Calendar1.SelectedDates.Clear();
   }

}

這里的問題是,我相信如果選擇了相同的日期,則不會觸發“SelectionChangeCalendar”。

標記:

<asp:Calendar ID="Calendar1" runat="server" OnSelectionChanged="SelectionChangeCalendar"></asp:Calendar>

編輯:添加標記

編輯:包含來自 yazanpro 的修復

您是正確的,如果您單擊已選擇的日期,則 OnSelectionChanged 事件不會觸發。 但是,它確實會使用事件目標和事件參數回發,就像它是不同的日期一樣,因此您可以檢查表單參數,然后從那里開始。 訣竅是,如果您檢查頁面加載然后清除所選日期,您最終會觸發 OnSelectionChanged 事件並且該日期再次被選中。 但是,如果您等到日歷處理回發數據並確定沒有更改之后,您就可以成功清除日期。 這是我用來讓它工作的代碼:

public partial class WebForm1 : System.Web.UI.Page
{
    bool clear = true;

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Calendar1_SelectionChanged(object sender, EventArgs e)
    {
        //if we are here, the date actually changed, so set clear to false
        clear = false;
    }

    protected void Calendar1_PreRender(object sender, EventArgs e)
    {
        //if clear is true and the event target is the calendar and a date was clicked
        if (clear  
            && !string.IsNullOrEmpty(Request.Form["__EVENTTARGET"])
            && Request["__EVENTTARGET"].Contains(Calendar1.ID)
            && char.IsDigit(Request.Form["__EVENTARGUMENT"][0]))
        {
            Calendar1.SelectedDates.Clear(); //clear the date
        }
    }

}

標記:

<asp:Calendar ID="Calendar1" runat="server" OnPreRender="Calendar1_PreRender" OnSelectionChanged="Calendar1_SelectionChanged"></asp:Calendar>

clear 變量只是跟蹤日期是否實際更改。 如果是,OnSelectionChanged 事件將觸發,我們知道我們不必清除任何日期。 以下是步驟:

1)當頁面回發時,如果事件目標是日歷,則日歷會檢查帖子數據以查看選擇是否已更改。 如果有,它會調用事件處理程序,我們設置clear = false ,這意味着我們知道點擊了不同的日期。 如果選擇沒有改變,日歷將不會觸發 even 和 clear 保持為真。

2)事件處理完畢后,我們使用預渲染事件來檢查事件目標是否是日歷。 如果是,並且 clear 仍然為真,那么我們就知道單擊了所選日期或日歷控件之一。 事實證明,如果單擊控件,則事件參數以字母開頭。 如果單擊日期,則它以數字開頭(參數是自 2000 年 1 月 1 日以來的天數)。 所以我們要做的就是檢查事件參數的第一個字符是否是數字,以查看當前選擇的日期是否被點擊。 如果是這樣,我們清除日期,我們就完成了。

我不知道,它有效,但它聞起來。 也許有更好的方法來做到這一點? 雖然 Calendar 控件似乎並非設計為以這種方式工作。 無論如何,我希望這會有所幫助!

 protected void Calendar1_SelectionChanged(object sender, EventArgs e)
        {
            //Check if selected Date is in the saved list
            // Remove the Selected Date from the saved list
            if (SelectedDates.Contains(Calendar1.SelectedDate))
                SelectedDates.Remove(Calendar1.SelectedDate);
            else
                SelectedDates.Add(Calendar1.SelectedDate);
            ViewState["Dates"] = SelectedDates;
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM