gpt4 book ai didi

c# - 使所有表单都可以访问表单功能

转载 作者:太空宇宙 更新时间:2023-11-03 20:16:42 24 4
gpt4 key购买 nike

我在 Form1 上有这个函数,我想对 Form2Form3 等使用相同的函数,而不是重复每个表单上的功能有什么方法可以让所有人都可以访问它吗?我试图制作一个新的 Class : Form 然后从表单调用函数,但没有工作...

public void tb_Leave(object sender, EventArgs e)
{
if ((sender as TextBox).Text.Count() < (sender as TextBox).MaxLength)
(sender as TextBox).Text = (sender as TextBox).Text.PadLeft((sender as TextBox).MaxLength, '0');
}

更新

感谢您的回答,它们工作正常,但是如果我想对 X 文本框使用相同的方法怎么办? (就像我对 tb_Leave 函数所做的那样)

我的意思是,使用我的旧方法,我只需选择 X 个文本框并将离开事件发送到我的函数,就像你提到的那样,我需要创建一个方法来调用辅助类中的另一个方法......但我仍然需要在每个表单中创建一个方法来调用该类,对吗?虽然,您的回答实际上非常有帮助,因为我只需要用我所有的帮助类创建一个新的 .cs 文件:)

更新 2我在迁移此方法时遇到问题

public static void TextBoxKeyDown(this TextBox tb, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Enter:
case Keys.Add:
e.SuppressKeyPress = true;
processTabKey(true);
break;
case Keys.Decimal:
if (tb.Tag == "importe")
{
e.SuppressKeyPress = true;
processTabKey(true);
}
break;
case Keys.Subtract:
e.SuppressKeyPress = true;
processTabKey(false);
break;
}
}

当然我知道 processTabKey(); 只会在事件表单上工作,但是如何让它在 Form 类之外工作?

最佳答案

这是您代码的真正简化版本。要创建一个可在任何地方重用的方法,请创建一个包含简单静态类的新 Utility.cs 文件

namespace MyApp.Utilities
{
public static class MyUtility
{
public static void PadForTextBox(TextBox tb)
{
if (tb.Text.Length < tb.MaxLength)
tb.Text = tb.Text.PadLeft(tb.MaxLength, '0');
}
}
}

现在您可以从每个引用您定义类的 namespace 的表单调用此方法。

public void tb_Leave(object sender, EventArgs e)
{
Utility.PadForTextBox(sender as TextBox);
}

另一种实现相同结果的优雅方法是通过 TextBox 的扩展方法

namespace MyApp.Utilities
{
public static class TextBoxExtensions
{
public static void PadForTextBox(this TextBox tb)
{
if (tb.Text.Length < tb.MaxLength)
tb.Text = tb.Text.PadLeft(tb.MaxLength, '0');
}
}
}

并用

调用它
public void tb_Leave(object sender, EventArgs e)
{
(sender as TextBox).PadForTextBox();
}

顺便说一句,使用这些方法还可以让您摆脱丑陋的强制转换序列。

当然,您的 tb_Leave 方法是一个事件处理程序,因此它应该链接到文本框。
如果您希望应用程序中的每个文本框都有一个通用的文本框事件处理程序,独立于创建文本框的表单,那么您不能依赖 WinForm Designer,但您需要手动将事件处理程序添加到您的文本框在 InitializeComponent 调用之后形成构造函数。总而言之,我更愿意将此任务留给设计师,并在需要时添加上面的单行。例如:

InitializeComponent();
// connect the leave event for 3 textboxes to the same static method inside the
// MyUtility static class
textBox1.Leave+=MyUtility.PadEventForTextBox;
textBox2.Leave+=MyUtility.PadEventForTextBox;
textBox3.Leave+=MyUtility.PadEventForTextBox;

.....

public static void PadEventForTextBox(object sender, EventArgs e)
{
TextBox tb=sender as TextBox;
if (tb.Text.Length<tb.MaxLength)
tb.Text=tb.Text.PadLeft(tb.MaxLength, '0');
}

关于c# - 使所有表单都可以访问表单功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16213929/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com