【问题标题】:How to present formatted information on a .Net form?如何在 .Net 表单上呈现格式化信息?
【发布时间】:2009-09-17 11:22:00
【问题描述】:

我有一个简单的小应用程序,它对我们所有的企业客户进行一些分析,并根据他们的活动为每个客户生成一个分数(想想“红绿灯”幸福系统)。

生成的分数从各种指标中获取信息,并吐出看似任意的幻数。

我想以一种易于使用的方式呈现算法结果。

目前,我正在使用一个简单的 HTML 文档,显示在 Web 浏览器控件中,由每个记录的算法生成。

例如,输出如下所示:

一次会议可提供 20 分。召开 1 次会议。 20 分。 每个电话给予5分。有 5 个电话。 25 分。 每次购买可获得10分。有 2 次购买。 20 分。

(实际上,关键字上也有一些微妙的颜色亮点)

由生成的 HTML 填充的嵌入式 Web 浏览器控件真的是实现此类事情的最佳方式吗?好像有点不对。

目前正在使用winforms,但由于它是一个新的、内部的和简单的应用程序,如果更合适,可以切换到WPF。

【问题讨论】:

    标签: .net winforms user-interface


    【解决方案1】:

    如果您不使用 WPF,那么答案是肯定的。这是最好的方法,尤其是因为格式。

    不过,WPF 会是一个更好的主意,所以如果可以,请继续。 XAML 是你的朋友。


    编辑:

    Righto,所以如果这是一个 WPF 应用程序,您可以使用例如 Grid 来为自己提供所需的正确列和行格式。然后,从这一点开始,您可以添加LabelTextBox(后者的格式化功能较少)并扩展控件ControlTemplate,或者根据您的需要简单地添加Style

    现在,如果您想对收到的值进行条件格式设置,您可以使用 DataTemplateDataTrigger 来显示样式,具体取决于数据。

    基本上,WPF 将为您提供更多的灵活性、稳健性和学习能力,而不是使用带有一些好的 HTML 的 WebBrowser 控件。

    PS:您还可以对DataGrid 控件进行模板化并对其进行样式化以满足您的需求,甚至可以为多种显示类型动态加载ResourceDictionary。 WPF 非常灵活。

    【讨论】:

    • XAML 可能是我的朋友,但很高兴知道他将如何帮助我。
    • 谢谢 - 很多信息!听起来我现在的选择是在使用 HTML 和 winforms 之间,我知道并且可以快速完成,或者以此为借口来学习 WPF :)
    • 如果这是一个小型的个人应用程序,请立即学习一些 WPF。你不会后悔的:)
    【解决方案2】:

    您可以使用 RichTextBox 类。它可以显示格式化文本(就像写字板一样),但您必须为此类提供Rtf 格式。如果你只有 HTML,浏览器是个好主意。

    【讨论】:

      【解决方案3】:

      我将从架构的角度来考虑。

      您可以考虑某种可配置的模板化方案,并在任何表示层中实现它。

      即,模板存储在 xml 或数据库中,表示层了解如何呈现数据。

      这样您就可以轻松切换到任何合适的演示文稿。

      【讨论】:

        【解决方案4】:

        我会使用 WebBrowser 控件 来执行以下操作:

            private void Form1_Load(object sender, EventArgs e)
            {
                StringBuilder sb = new StringBuilder();
        
                sb.AppendLine("<table style='width:100%;'>");
        
                sb.AppendLine("<tr>");
                // A meeting gives 20 points.      Have 1 meeting.      20 points.
                sb.AppendLine(AddTableDefinition(20, 1, "meeting"));
                sb.AppendLine("</tr><tr>");
                // Each phonecall gives 5 points.  Have 5 phone calls.  25 points.
                sb.AppendLine(AddTableDefinition(5, 5, "phone call"));
                sb.AppendLine("</tr><tr>");
                // Each purchase gives 10 points.  Have 2 purchases.    20 points.
                sb.AppendLine(AddTableDefinition(10, 2, "purchase"));
                sb.AppendLine("</tr>");
        
                sb.AppendLine("</table>");
        
                webBrowser1.DocumentText = sb.ToString();
            }
        
            private string AddTableDefinition(int pointsPerUnit, int units, string word)
            {
                return
                    String.Format(
                        "<td>A <strong>{0}</strong> gives <strong>{2}</strong> points.</td><td>Have <strong>{3}</strong> {1}.</td><td><strong>{4} points</strong>.</td>",
                            word, (units > 1) ? word + "s" : word,
                            pointsPerUnit, units, pointsPerUnit * units);
            }
        

        结局像

        alt text http://www.balexandre.com/temp/2009-09-17_1342.png

        【讨论】:

        • 这正是我目前的做法。它工作正常(尽管我在让 webbrowser 控件正常运行时遇到了问题),但我想确保我没有做一些特殊的事情。
        • 只要填写一个HTML元素,甚至可以在WebBrowser.DocumentText中包含CSS就可以了。
        【解决方案5】:

        您可以使用 GDI 并通过自定义控件中的绘制方法执行此操作。不过这要写一大堆格式化代码!

        过去我使用 HTML + webbrowser 控件来处理这类事情,没有很多问题。

        RickTextBox 控件显示格式化文本,但可能更难使用,(我假设您已经了解一点 HTML)。 RickTextBox 控件也不像 HTML 那样灵活。

        您可以将 WPF 与 XAML 一起使用,它可以很好地完成这项任务。但是,您必须先学习 WPF……

        因此我认为 HTML + webbrowser 控件是你最好的选择。

        【讨论】:

          猜你喜欢
          • 2019-03-15
          • 2021-03-11
          • 2010-11-18
          • 2019-07-29
          • 2020-05-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-14
          相关资源
          最近更新 更多