如何使用 C# 将 TextBox 对象作为参数传递给方法

How to pass a TextBox Object as a parameter to a method using c#

我想将一个文本框对象传递给一个函数,然后该函数验证在 "KeyPress" 事件上处理的密钥。

我在一个名为 "common" 的 class 中创建了一个方法,就像这样

public void PreventInput(Telerik.WinControls.UI.RadTextBox tb, KeyPressEventArgs e, bool isDouble = true)
{

    string input = tb.Text;

    if (isDouble)
    {
        if ((Char.IsDigit(e.KeyChar))
            || (Char.IsControl(e.KeyChar))
            || ((e.KeyChar == '.') && (input.Contains(".") == false))
        )
        {
            return;
        }
    }
    else
    {

        if ((Char.IsDigit(e.KeyChar))
            || (Char.IsControl(e.KeyChar))
        )
        {
            return;
        }

    }

    e.Handled = true;
}

然后当我想在 keyPress 事件中调用这个函数时,我这样做

private void InputUnitPrice_KeyPress(object sender, KeyPressEventArgs e)
{
    Common.PreventInput(sender, e, true);

}

但由于某种原因,调用此方法时出错。

cannot convert from 'object' to 'Telerik.WinControls.UI.RadTextBox

RM.Common.PreventInput(Telerik.WinControls.UI.RadTextBox, System.Windows.Forms.KeyPressEventArgs, bool)' has some invalid arguments

此代码可以正常工作,但每次我想将输入限制为仅数字时,我都试图避免一遍又一遍地重写代码

private void InputUnitPrice_KeyPress(object sender, KeyPressEventArgs e)
{

    string input = (sender as Telerik.WinControls.UI.RadTextBox).Text;

    if ((Char.IsDigit(e.KeyChar))
        || (Char.IsControl(e.KeyChar))
        || ((e.KeyChar == '.') && (input.Contains(".") == false))
    ){
        return;
    }

    e.Handled = true;
}

问题是如何让 PreventInput 方法正常工作。

已编辑

根据下面的反馈,我尝试了以下方法(但仍然没有用)

    public bool PreventInput(string input, KeyPressEventArgs e, bool isDouble = true)
    {

        if (isDouble)
        {
            if ((Char.IsDigit(e.KeyChar))
                || (Char.IsControl(e.KeyChar))
                || ((e.KeyChar == '.') && (input.Contains(".") == false))
            )
            {
                return false;
            }
        }
        else
        {

            if ((Char.IsDigit(e.KeyChar))
                || (Char.IsControl(e.KeyChar))
            )
            {
                return false;
            }

        }

        return true;
    }

我这样称呼它

e.Handled = Common.PreventInput((sender as Telerik.WinControls.UI.RadTextBox).Text, e, true);

您需要将 senderObject 转换为 RadTextBox

var txt = (Telerik.WinControls.UI.RadTextBox) sender;
Common.PreventInput(txt, e, true);

但是为什么要传递控件而不仅仅是文本?该方法应该验证输入并将操作留给它的调用者。这样它就可以重复使用并且不依赖于任何控件。

所以你可以这样写:

public bool ValidateInput(string input, bool isDouble = true)
{
    bool isValid;
    //  insert your logic here ...
    return isValid;
}

现在根据需要处理 return 值:

var txt = (Telerik.WinControls.UI.RadTextBox) sender;
e.Handled = Common.ValidateInput(txt.Text, true);

首先将对象转换为文本框:

Common.PreventInput(sender as Telerik.WinControls.UI.RadTextBox, e, true);

你的逻辑也可以稍微简化一下:

public void PreventInput(Telerik.WinControls.UI.RadTextBox tb, 
    KeyPressEventArgs e, bool isDouble = true)
{
    string input = tb.Text ?? string.Empty;

    if (Char.IsDigit(e.KeyChar) || Char.IsControl(e.KeyChar))
    {
        return;
    }

    if (isDouble && e.KeyChar == '.' && !input.Contains("."))
    {
        return;
    }

    e.Handled = true;
}