2017-06-21 128 views
0

我正在Visual C++中使用Visual Studio開發Windows窗體應用程序。我的表單上有96個複選框。與其創建96個Click事件,我相信有一種方法可以創建單擊任何複選框時調用的Click事件。在Click事件中,我需要確定活動複選框是否已選中或未選中。雖然這應該很容易,但我似乎無法弄清楚!確定是否在Winforms中選中活動複選框

我知道它與下面的代碼一起工作,但我確信有更好的方法。

if (sender == checkBox_D1) 
    { 
     if (checkBox_D1->Checked) 
      isChecked = true; 
    } 
    else if (sender == checkBox_D2) 
    { 
     if (checkBox_D2->Checked) 
      isChecked = true; 
    } 
    else 
     return; // Invalid sender - should not get here! 

    if (isChecked) 
    { 
     // Do something 
    } 
    else 
    { 
     // Do something else 
    } 

我也試過下面的代碼,但activeCheckBox不是複選框對象,所以它不起作用。

Control^activeCheckBox = ActiveControl;

activeCheckBox->正文返回的複選框

activeCheckBox->經過不編譯Text屬性。錯誤是'檢查':不是'System :: Windows :: Forms :: Control'的成員

似乎發件人有我需要的數據,但我不知道如何訪問它。

有沒有辦法按如下方式聲明覆選框?

CheckBox activeBox;

然後將activeBox分配給具有焦點的複選框 activeBox = ???

// Then just need to do this! 
if (activeBox.Checked) 
    isChecked = true; 

謝謝你的幫助。

回答

0

是的,你可以在你的所有複選框中重複使用相同的功能。

void App3::ItemPage::checkBox_Checked(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) 
{ 
    CheckBox^ activeCheckBox = safe_cast<CheckBox^>(sender); 

    if (activeCheckBox->Checked) 
    { 
     if (activeCheckBox->Name == "checkBox_D1") { 
      //Do something when this check box is clicked. 
     } 
     if (activeCheckBox->Name == "checkBox_D2") { 
      //Do something when this check box is clicked. 
     } 
    } 
} 
+0

嗨EJD,謝謝你看我的問題和你的答覆。當我編譯CheckBox activeCheckBox =(CheckBox)發件人時出現錯誤;在你的例子中,發送者是作爲類型對象傳遞的。我正在使用Winforms,並且發件人作爲System :: Object ^傳遞。錯誤是C2440和C3673。謝謝! –

+0

什麼是錯誤?我沒有注意到你正在使用visual-++,這個想法仍然是你需要將發件人投遞到CheckBox的想法。 – EJD

+0

我得到兩個錯誤:C2440:'type cast':無法從'System :: Object ^'轉換爲'System :: Windows :: Forms :: CheckBox' 1>轉換需要構造函數或用戶定義的轉換運算符,它不能被const_cast使用或reinterpret_cast 錯誤C3673:'System :: Windows :: Forms :: CheckBox':類沒有複製構造函數 –

0

對於所有checBoxes你會分配相同的CheckedChanged事件:

checkBox1.CheckedChanged += newCheckBoxCheckedOrUnchecked_CheckedChanged; 
checkBox2.CheckedChanged += newCheckBoxCheckedOrUnchecked_CheckedChanged; 
//... 
//... 
checkBox95.CheckedChanged += newCheckBoxCheckedOrUnchecked_CheckedChanged; 
checkBox96.CheckedChanged += newCheckBoxCheckedOrUnchecked_CheckedChanged; 

檢查所有的複選框的狀態:僅該複選框,其中值的

private void newCheckBoxCheckedOrUnchecked_CheckedChanged(object sender, EventArgs e) 
{ 
    foreach (Control control in this.Controls) 
    { 
     if (control.GetType() == typeof(CheckBox)) 
     { 
      var checkBox = (CheckBox) control; 
      var checkBoxName = checkBox.Name; // To know which checkbox we are talking about 
      var checkBoxIsChecked = checkBox.Checked; 
      // Do your stuff 
      MessageBox.Show(checkBoxName + @" is " + (checkBoxIsChecked ? "checked" : "not checked")); 
     } 
    } 
} 

檢查狀態已更改:

private void newCheckBoxCheckedOrUnchecked_CheckedChanged(object sender, EventArgs e) 
{ 
    var checkBox2 = (CheckBox)sender; 
    var checkBoxName2 = checkBox2.Name; // To know which checkbox we are talking about 
    var checkBoxIsChecked2 = checkBox2.Checked; 
    // Do your stuff 
    MessageBox.Show(checkBoxName2 + @" is " + (checkBoxIsChecked2 ? "checked" : "not checked")); 
} 
+0

嗨伊莎貝拉,感謝您的建議。它看起來像Visual Basic?我正在使用C++。這不是主要問題。我只是不明白你的代碼。 :o)我將試圖弄清楚,但是我認爲我會遇到與EJD的建議相同的問題,因爲您在您的示例中投入了控件來鍵入CheckBox,並且編譯器不喜歡此投射。非常感謝。 –

+0

我的代碼工作,但它是一個非常長的函數,因爲它有96 if/else if語句。如果我只知道如何訪問System :: Object^sender中的Checkbox-> Checked屬性,我可以將該函數壓縮成幾行。這可能嗎?如果沒有,我會用我現有的代碼去。非常感謝。 –

相關問題