用于双向搜索枚举的用户界面设计

时间:2010-02-03 15:59:18

标签: c# user-interface

我有一个文件,用于存储枚举列表及其关联值。以下是文件的外观(而不是实际内容):

Enumerated value        Meaning (associated text)
0                       Sunday
1                       Monday
2                       Tuesday
3                       Wednesday
4                       Thursday
5                       Friday
6                       Saturday

我正在编写一个C#程序,允许用户在枚举值及其相关文本之间查找。换句话说,他们应该能够从值中查找文本,反之亦然。

我想知道设计用户界面的最佳方法是什么?我有几个想法:

  1. 有两个文本框。用户可以填写其中任何一个,另一个自动填充用户键入。如果该值无效,只需将另一个文本框留空即可。
  2. 有一个文本框供用户填写他们所拥有的信息的一面,一个单选按钮,用于指定他们填写的文本框中的信息,一个OK按钮,按下时,更新文本标签结果或错误消息。
  3. 与2相同,但没有OK按钮。只需在用户输入时更新文本标签(即处理Control.KeyPress事件)。
  4. 有两个单独的屏幕(一个用于从文本中搜索枚举,另一个用于从枚举中搜索文本),用户可以通过选项卡或按钮在它们之间进行切换。有一个用户输入的文本框,一个OK按钮和一个文本标签,用于显示结果或错误消息。
  5. 在同一屏幕上有两个独立的区域。每个区域的格式与4中的格式相同。
  6. 我认为2是我对GUI应用程序的期望,虽然它可能有点慢但是如果用户只键入“S”并按下OK则会出现什么问题。选项1更加混乱,但可能更具互动性(更快地显示答案)。

    很抱歉,如果这不是一个严格的编程问题,但我认为这是一个经常出现的UI设计问题。有人知道任何行业标准的最佳做法吗?

    非常感谢。

5 个答案:

答案 0 :(得分:2)

您预计列表中有多少项?如果它是一个相当小的数字,可能< 100,我实际上采用Tufte方法并且只是并排显示两个精心设计的表(一个按值排序,另一个按意义排序)。眼/脑连接可以比我们意识到的更快地解析数据;我认为Tufte声称每只眼睛能够达到~10Mbit /秒。

如果你有很多不同类型的数据,我认为#1是你最好的选择。最少数量的表单控件,您可以快速通过AJAX或内联数组检索数据。确保您的教学文本完全清晰简洁。

我认为这种方法的唯一缺点是它会阻止用户查看相关数据集并自行建立模式。例如,如果你告诉我0 =星期日和1 =星期一,我可以合理地假设2 =星期二。如果用户理解模式,我宁愿看到他们使用它,而不是必须为每个单独的值使用表单。

答案 1 :(得分:1)

我认为你的变种太复杂了。如果不需要浏览枚举,我认为最好的基于键盘的界面只有一个带有自动完成功能的文本字段和旁边(下方)的标签来显示结果。

当用户输入时,程序会搜索两个值和文本,并将部分匹配作为建议。 只要匹配(完整或甚至部分),就会显示其对应部分。因此,如果匹配值,则显示相应的文本,反之亦然。

甚至更简单,只需在用户输入时显示匹配的值 - 文本对列表,并使用每个键入的字符逐步更新。无需按Enter键。

答案 2 :(得分:1)

我曾经使用像#1这样的解决方案。它的重要部分是确保您始终保持框同步,或者用户可能误读旧值作为有效翻译。在我的情况下,一旦用户开始输入(或甚至粘贴)其中一个,我就清除了另一个盒子。

它还取决于使用的类型 - 这是用户经常使用的东西,如果能够最大限度地减少击键次数,或者给定用户很少会遇到的东西,可以允许一些学习曲线吗?

答案 3 :(得分:0)

假设您有枚举设置类似

public enum Days { Sunday = 0, Monday = 1, Tuesday = 2, Wednesday = 3, Thursday = 4, Friday = 5, Saturday = 6 };

难道你不能只使用几种辅助方法吗?

    public static int GetEnumValue(string name, Type enumType)
    {
       int result = -1;

       foreach (var item in Enum.GetValues(enumType))
       {
           if (item.ToString() == name)
           {
               result = (int) item;
               break;
           }

       }

       return result;
    }

    public static string GetEnumValue(int value, Type enumType)
    {
        string result = null;

        foreach (var item in Enum.GetValues(enumType))
        {
            if ((int)item  == value)
            {
                result = item.ToString();
                break;
            }
        }

        return result;
    }

或者我误解了这个问题。

答案 4 :(得分:0)

非常感谢您的回答。在考虑了所有输入后,我提出了接口的建议。

  • 在程序开始时,将加载所有枚举字段及其字段编号的列表,以及它们的枚举值。
  • 初始界面将包含TextBox和ListBox。最初,ListBox将显示所有枚举字段。当用户在TextBox中键入时,将从ListBox中删除不匹配的项(字段名称或字段编号)。
  • 双击ListBox上的项目(即枚举字段),或者选择它然后按ENTER键,将显示一个新窗口。
  • 新窗口将在包含两列的表中显示所有枚举值及其相关文本(对于在第一个窗口中选择的枚举字段)。
  • 通过单击列可以对列表进行排序。用户还应该能够使用Ctrl-F来搜索列表(希望在C#应用程序中允许这样做)。

我为初始窗口做了选择,以简化界面(只有1个文本框和列表框)并使其易于使用。此外,我认为将枚举值一起显示并允许用户按照他/她喜欢的方式播放信息,这比将所有内容隐藏在精心设计的界面后要好得多。

非常感谢您对界面设计的反馈。

PS目前,用户必须访问网站,找到最新版本的xml文档,下载,打开它,然后搜索XML以查找他们正在查找的字段,然后查找所需的值。我的应用程序应该极其简化它们。