【问题标题】:Centralizing Messagebox handling for application集中处理应用程序的消息框
【发布时间】:2010-04-16 16:02:18
【问题描述】:

我想知道其他人如何处理尝试集中 MessageBox 函数调用。在过去(非 .net 语言),我不会在代码中到处嵌入长文本,而是将系统和应用程序基础“消息框”类型的消息放入数据库文件中,该文件将被“刻录”到可执行文件中,很像 .Net 中的资源文件。当出现提示条件时,我会调用类似

MBAnswer = MyApplication.CallMsgBox(IDUserCantDoThat)

然后在返回时检查 MBAnswer,例如是/否/取消或其他。

在数据库表中,我会包含消息框标题、将显示的按钮、实际消息、自动附加在后续标准注释上的特殊标志,例如“如果出现这种情况,请联系服务台发生。”。该函数将调用具有所有适用设置的消息框并返回答案。这样做的最大好处是,在一个位置拥有消息的所有“上下文”,并且通过常量,更容易阅读将要呈现给用户的消息。

是否有人在 .Net 中有类似的系统来执行类似的方法,或者这只是 .Net 环境中的一个坏主意。

【问题讨论】:

    标签: c# implementation messagebox centralized


    【解决方案1】:

    我们曾经使用模块 (VB) 来处理集中式消息。我们有一个包含所有消息的模块,我们在代码中调用它。这样做是为了让我们在一个地方更改消息(由于业务需要),它会在各处得到反映。而且处理一个文件而不是多个文件来更改消息也很容易。我们还向业务分析师 (VSS) 开放了该文件,以便他们可以更改它。如果它涉及模块或静态类,我认为这不是一个坏主意,但从数据库中获取它可能是一种矫枉过正。

    HTH

    【讨论】:

    • 这是类似的目的,集中元素。使用 DBF 的原因是我多年来一直在使用 VFP 进行开发,只需将表刻录到 EXE 中并根据 ID 直接从其中查询并拥有所有可用元素,这非常容易。
    • 哦,有道理 :-)...我们这样做的主要原因是避免测试人员要求我们对信息进行如此多的更改...哈哈。所以把它交给了业务分析师(在项目结束时他几乎没有什么可做的)来解决这些问题。
    • 当你提到用模块做这件事时......你的意思是你有一个所有不同的消息框调用的类,你可以在系统(或子模块的子系统)内调用?并且在每个单独的方法中都将包含自己的文本、按钮设置等。如果是这样,与使用资源文件相比,所有嵌入式消息的这种足迹的静态类对内存的影响是什么?
    【解决方案2】:

    您可以使用资源文件将所有文本导出到那里(还有一种本地化功能)。 Resharper 5.0 确实有助于突出显示可以移动到资源的文本。

    通常是这样的:

    1. 之前:MessageBox.Show(error.ToString(), "Error with extraction");
    2. 建议:可本地化的字符串“提取错误”
    3. 右键单击移动到资源
    4. 选择资源文件和名称 (MainForm_ExtractArchive_Error_with_extraction),同时选中复选框 Find same items in class ...
    5. 这样称呼它MessageBox.Show(error.ToString(), Resources.MainForm_ExtractArchive_Error_with_extraction);

    最重要的是,它可以轻松地将内容翻译成其他语言,并将 MessageBox 的文本保存在单独的 Resource 中。当然 Resharper 会为您完成所有工作,因此无需输入那么多内容 :-)

    【讨论】:

    • 这与我的想法很接近,但 Resharper 并非如此...试图限制任何子许可项目以用于分发目的和其他原因。
    • 一般想法在没有 Resharper 的情况下是可行的,但 Resharper 只是让它变得非常简单。
    【解决方案3】:

    我想你可以使用 HashTable 来做类似这样的事情,这可以在以下位置找到:

    using System.Collections;
    

    为了保持全局可访问性,我想在一个持有哈希表的类中使用几个函数来获取/设置某个函数。 现在让我们看看。

    public class MessageBoxStore
    {
        private HashTable stock;
        public string Get(string msg)
        {
            if (stock.ContainsKey(msg))
                return stock[msg];
            else
                return string.Empty;
        }
    
        public string Set(string msg, string msgcontent)
        {
            stock[msg] = msgcontent;
        }
    }
    

    或类似的东西,您可以在哈希表中保留多个不同的信息,然后也可以在函数中编写消息框.. 而不是只返回消息框内容的字符串... 但是使用它会很简单。

    在程序加载时调用这样的函数。

    public LoadErrorMessages()
    {
        storeClass = new MessageBoxStore();
        storeClass.Set("UserCantDoThat", "Invalid action. Please confirm your action and try again");
    }
    

    例如,然后。

    MessageBox.Show(storeClass.Get("UserCantDoThat"));
    

    我把它放在一个新类中,而不是直接使用 HashTable 的 get/set 方法,因为这为自定义留下了空间,因此可以在 get 中创建消息框,并且可以在 set 中存储多条信息处理消息框标题、按钮类型、内容等。

    【讨论】:

    • 感谢您的意见,您的意见与 MadBoy 的意见相得益彰...我将根据我开始的内容进行推杆,并可能使用所提供的类似原则。
    猜你喜欢
    • 1970-01-01
    • 2013-03-30
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多