簡體   English   中英

單選按鈕檢查更改事件觸發兩次

[英]Radio button checked changed event fires twice

請閱讀我的問題,它不是重復的問題。

我在 Windows 窗體上有三個單選按鈕,所有這些按鈕都關聯了常見的“CheckedChanged”事件。 當我單擊這些單選按鈕中的任何一個時,它會觸發 'CheckedChanged' 事件兩次。

這是我的代碼:

private void radioButtons_CheckedChanged(object sender, EventArgs e)
{
    //My Code
}

我插入了斷點,此事件中的整個代碼迭代了兩次。 請告訴我為什么它會這樣?

正如其他回答者正確地說的那樣,該事件被觸發兩次,因為每當檢查組中的一個 RadioButton 時,另一個將被取消選中 - 因此檢查的更改事件將觸發兩次。

要僅在此事件中為剛剛選擇的 RadioButton 執行任何操作,您可以查看發送方對象,執行如下操作:

void radioButtons_CheckedChanged(object sender, EventArgs e)
{
    RadioButton rb = sender as RadioButton;
    if (rb != null)
    {
        if (rb.Checked)
        {
            // Only one radio button will be checked
            Console.WriteLine("Changed: " + rb.Name);
        }
    }
}

每當 Checked 屬性更改時,都會引發 CheckedChanged。 如果您選擇一個 RadioButton,則先前選擇的 RadioButton 將被取消選中(觸發 CheckedChanged),然后新的 RadioButton 被選中(觸發 CheckedChanged)。

為了避免它,只需檢查是否選中了radioButton

例如:

private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
    if (radioButton1.Checked)
        //your code
}

它觸發一次單選按鈕從選中狀態轉換為未選中狀態,並再次觸發單選按鈕從未選中狀態轉換為選中狀態(即選中狀態的任何更改都會觸發事件)

您可以為每個 RadioButton 設置 AutoCheck 屬性為 true,然后捕獲 Click 事件而不是 CheckChanged 事件。 這將確保只觸發一個事件,如果需要處理點擊,處理程序中的邏輯可以將發送者轉換為類型 RadioButton。 如果處理程序邏輯很簡單,通常可以避免強制轉換。 這是一個處理三個控件的示例,rbTextNumeric、rbTextFixed 和 rbTextFromFile:

        private void rbText_Click(object sender, EventArgs e)
    {
       flowLayoutPanelTextNumeric.Enabled = rbTextNumeric.Checked;
       txtBoxTextFixed.Enabled = rbTextFixed.Checked;
       flowLayoutPanelTextFromFile.Enabled = rbTextFromFile.Checked;
    }
{
    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }
        int click = 0;
        private void radioButton1_Click(object sender, EventArgs e)
        {
            click++;
            if (click %2==1)
            {
                radioButton1.Checked = true;
            }
            if (click %2==0)
            {
                radioButton1.Checked = false;
            }
            if (radioButton1.Checked==true)
            {
                label1.Text = "Cheked";
            }
            if (radioButton1.Checked==false)
            {
                label1.Text = "Uncheked";
            }
        }

    }
}

其他答案是正確的,但錯過了潛在問題的原因。 當檢查單選按鈕時,發送的第一個事件是從未選中的項目的更改,但是如果您通過其控件名稱檢查其狀態,您仍將看到其舊的選中狀態,因為表單尚未更新。 要查看其真實狀態,您需要轉換發送者對象。 這允許您在需要時執行與正在取消選擇的條件相關的任何操作。

在下面的常見情況下,多個單選按鈕被發送到同一個處理程序事件。 簡單地檢查發件人的狀態以進行檢查在這里是行不通的,因為我們需要根據按下的單選按鈕執行不同的操作。 所以首先我們忽略任何剛剛被取消檢查的發件人。 然后我們通過控制名稱識別檢查的發件人以處理正確的操作。

private void ModeChangedExample(object sender, EventArgs e)
{
    // multiple radio buttons come here
    // We only want to process the checked item.
    // if you need to something based on the item which was just unchecked don't use this technique. 
    // The state of the sender has not been updated yet in the form.
    // so checking against rdo_A check state will still show it as checked even if it has just been unchecked
    // only the sender variable is up to date at this point.
        
    // To prevent processing the item which has just been uncheked
    RadioButton RD = sender as RadioButton;
    if (RD.Checked == false) return;

    if (rdo_A.Name == RD.Name)
    {
        //Do stuff
    }

    if (rdo_B..Name == RD.Name)
    {
        // Do other stuff
    }

    if (rdo_C.Name == RD.Name)
    {
        // Do something else
    }

}

當連續單擊一系列 RadioButton 時,會發生這種雙重檢查的問題。我遇到了同樣的問題。最后一次單擊會給出兩個結果。為了克服這個問題,我最后做了一個虛擬單擊。雙擊停止了。試試這個方法。 文卡特拉曼

暫無
暫無

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

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