【问题标题】:Determine whether the active check box is checked in Winforms确定是否在 Winforms 中选中活动复选框
【发布时间】:2017-06-21 23:40:52
【问题描述】:

我正在使用 Visual C++ 中的 Visual Studio 开发一个 Windows 窗体应用程序。我的表单上有 96 个复选框。与其创建 96 个 Click 事件,我相信有一种方法可以创建一个单击任何复选框时调用的 Click 事件。在 Click 事件中,我需要确定活动复选框是选中还是未选中。虽然这应该很容易,但我似乎无法弄清楚!

我让它与下面的代码一起工作,但我确信有更好的方法。

    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 不是 Checkbox 对象,所以它不起作用。

Control^ activeCheckBox = ActiveControl;

activeCheckBox->Text返回Checkbox的Text属性

activeCheckBox->Checked 无法编译。错误是“已检查”:不是“System::Windows::Forms::Control”的成员

好像发件人有我需要的数据,但我不知道如何访问它。

有没有办法如下声明一个复选框?

复选框活动框;

然后将activeBox赋给有焦点的Checkbox 主动框 = ???

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

感谢您的帮助。

【问题讨论】:

    标签: winforms visual-c++ checkbox focus


    【解决方案1】:

    是的,您可以为所有复选框重复使用相同的功能。

    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.
            }
        }
    }
    

    【讨论】:

    • 您好 EJD,感谢您查看我的问题并回复。编译 CheckBox activeCheckBox = (CheckBox)sender; 时出现错误在您的示例中,发件人作为类型对象传递。我正在使用 Winforms,发件人作为 System::Object^ 传递。错误是 C2440 和 C3673。谢谢!
    • 错误是什么?我没有注意到您使用的是 visual -++ 这个想法仍然是您需要将发件人转换为 CheckBox 的相同。
    • 我得到两个错误: C2440: 'type cast' : cannot convert from 'System::Object ^' to 'System::Windows::Forms::CheckBox' 1> 转换需要构造函数或用户定义的转换运算符,不能被 const_cast 或 reinterpret_cast 使用错误 C3673: 'System::Windows::Forms::CheckBox' : 类没有复制构造函数
    • 将代码修改为 Visual C++ 让我知道我的第一个代码是如何编写的 :)
    • 有效!太感谢了!你现在已经毕业到 C++ 了,哈哈,我只需要对你的代码做一点小改动。 if (activeCheckBox->Checked) ... IsChecked 是 Visual Basic 关键是将 sender 转换为 Checkbox 的正确方法。谢谢!
    【解决方案2】:

    对于所有 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"));
    }
    

    【讨论】:

    • 嗨,伊莎贝拉,谢谢您的建议。它看起来像 Visual Basic?我正在使用 C++。这不是主要问题。我只是不明白你的代码。 :o) 我将尝试弄清楚,但是我认为我会遇到与 EJD 的建议相同的问题,因为您在示例中将控制转换为类型 CheckBox 并且编译器不喜欢这种转换。非常感谢。
    • 我的代码可以工作,但它是一个很长的函数,因为它有 96 个 if/else if 语句。如果我只知道如何访问 System::Object^ sender 中的 Checkbox->Checked 属性,我可以将函数压缩为几行。这可能吗?如果没有,我将使用我现有的代码。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 2019-01-21
    • 2011-04-18
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多