C++/CLI Winform - 是否可以为多个文本框设置 1 个事件处理程序

C++/CLI Winform - Is it possible to have 1 event handler for multiple textboxes

我试图通过使用从另一个 post.

中找到的函数将用户输入限制为浮点数或整数
private: System::Void keypressValidation(System::Windows::Forms::TextBox^ textBox, System::Windows::Forms::KeyPressEventArgs^ e) {
        // Only allow 1 decimal point
        if (e->KeyChar == '.')
        {
            if (textBox->Text->Contains(".") && !textBox->SelectedText->Contains("."))
            {
                e->Handled = true;
            }
        }
        // Accepts only digits and Backspace keypress
        else if (!Char::IsDigit(e->KeyChar) && e->KeyChar != 0x08)
        {
            e->Handled = true;
        }
    }

现在我的 UI 上有 8 个文本框,我为每个单独的文本框创建了 8 个不同的按键事件处理程序。

private: System::Void txtN3_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e) {
        keypressValidation(txtN3, e);
    }
    private: System::Void txtN2_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e) {
        keypressValidation(txtN2, e);
    }
    private: System::Void txtN1_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e) {
        keypressValidation(txtN1, e);
    }
    private: System::Void txtN0_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e) {
        keypressValidation(txtN0, e);
    }
    private: System::Void txtD3_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e) {
        keypressValidation(txtD3, e);
    }
    private: System::Void txtD2_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e) {
        keypressValidation(txtD2, e);
    }
    private: System::Void txtD1_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e) {
        keypressValidation(txtD1, e);
    }
    private: System::Void txtD0_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e) {
        keypressValidation(txtD0, e);
    }

但稍后在我的项目中,我将有大约 64 个文本框,我发现为每个文本框设置一个事件处理程序太乏味了。 有没有一种方法可以使它更紧凑,例如多个文本框只有一个事件处理程序?

我的首选方法是遍历表单中的所有文本框并绑定单个事件处理程序。 这是 C++/CLI 中的示例代码:

private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e)
{
    for each (Control ^ ctrl in this->Controls)
    {
        if (ctrl->GetType() == TextBox::typeid)
        {
            ctrl->KeyPress += gcnew System::Windows::Forms::KeyPressEventHandler(this, &Form1::textBox1_KeyPress);
        }
    }
}

private: System::Void textBox1_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e)
{

}

你绝对可以只用一个处理函数来做到这一点。首先你必须处理函数之间的细微差别:

void txtGeneric_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e)
{
    keypressValidation(safe_cast<TextBox^>(sender), e);
}

那么设计者将每个文本框上的事件连接到这个统一的处理程序是一件简单的事情。不要双击事件列表中的处理程序条目,而是使用下拉列表 select 现有函数。

另一种选择是删除设计器中的所有处理程序并在运行时将它们连接起来,如@EylM 所建议的那样。请注意,只有当表单上的每个文本框都以相同的方式处理时,他的循环才会起作用,如果你有一个或两个不属于模式的一部分,你将需要更复杂的过滤。