WinForms 和子窗体 - 如何合并多余的 "utility"代码?

标签 winforms namespaces .net-2.0 assemblies organization

我首先搜索并使用 Google 搜索,我想肯定有人以前问过这个问题,但我肯定找不到对这个问题的很好的描述。

我有六个或八个类似的 C# .NET 2.0 WinForms 应用程序,这些应用程序使用相当常见的主应用程序窗口模型构建,其中包含多个 GUI 数据字段和几个用于进一步数据收集的模式对话框。许多数据字段(尤其是文本框)具有相同的数据验证例程。我一遍又一遍地编写相同的 xxx_Validating() 例程,在最简单的情况下,它只将输入文本的第一个字符(如果有)大写并重新显示结果。我有另一个用于邮政编码字段的字段,它采用 5 位美国邮政邮政编码的前 3 位数字,并使用 1000 个成员的字符串数组返回相应的州。简单的东西。还有一些其他的;这是一个例子:

public void CapFirstCharTextBox_Validating(object sender, CancelEventArgs e)
{
    string strValue = ((TextBox)sender).Text.Trim();
    if (strValue.Length >= 1) {
        if (char.IsLower(strValue[0])) {
            strValue = strValue.Substring(0, 1).ToUpper() + strValue.Substring(1);
            ((TextBox)sender).Text = strValue;     // fires (whatever sender)_TextChanged()
        }
    }
}

同样,这是六个左右这样的“实用程序”例程的一部分。对于每个对话框类,我只有一组这些,并且该对话框中需要它的所有各种 TextBox 的 Validating 事件都指向相同的方法。所以我在给定的源文件中没有 20 个(每个 TextBox 一个)或其他任何东西;整个对话类只有一个。

问题是,所有这些都存在于我需要它们的每个源文件中。这是主窗口的一组,每个弹出对话框的更多 - 太多了。我知道模态对话框类不能相互通信,并且使所有这些东西成为全局性的东西充其量是难以捉摸的,最坏的情况是一个很大的“禁忌”。

我已经成功地尝试将“FormMain”的引用(其中存在这些例程的一个副本)传递给各种对话框构造函数,然后使用它们自己的验证处理程序调用这些验证例程。它有效,但感觉非常笨重,当然不像最好的方法。

那么,我将如何(或者我想要)重新安排项目并更好地组织代码,以便只有这些类型的单个实例?我将如何连接此类方法的全局“实用程序”类,以便我可以从主窗体的代码和一堆弹出式模式对话框的代码中获取它?

如果可能的话,我想只维护一个没有额外 .DLL 的可执行文件(顺便说一下,这些都是每个解决方案一个项目),如果可行的话,我想进一步共享该公共(public)代码多种解决方案。

我认为答案将包括编写新的程序集,使用不同的命名空间(目前我在给定项目中的所有代码都包含在同一个命名空间中),并且可能将这些东西分离到同一个解决方案文件中的自己的项目中。

是否可以?

最佳答案

您可以通过将代码保存在一个位置并在每个解决方案中添加指向文件的链接来跨解决方案共享代码。

添加链接:右键单击要添加代码的项目(或文件夹),然后选择“添加现有项目”,浏览文件,找到后单击 按钮上的箭头,然后选择链接到。

这样链接到文件的项目将共享相同的代码。

顺便说一句:使用不知道如何处理这些链接的源代码控制系统时要小心。

关于WinForms 和子窗体 - 如何合并多余的 "utility"代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5928562/

相关文章:

c# - 将对象转换为单元素列表的快速方法?

c# - 从 C# 中的多个表的查询中检索数据

c# winforms - 在模式窗体之间传递参数

php命名空间使用变量不工作回退到全局

VB.NET - 从解决方案中的其他项目导入命名空间

php - 带有扩展或接口(interface)的命名空间会导致没有自动加载器的 fatal error

c# - 加快构建时间的方法? (C#/非托管 C++)

c# - 如何解析 XSL 包含在从字符串加载 XSL 的转换中?

c# - winform 上 this.close 调用后执行代码

.net - 如何绑定(bind) WinForm 文本框以在 TextChanged 而不是 LostFocus 上更新