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

3

我有一个文件,其中存储了一系列的枚举及其相关值。以下是该文件的示例(而非其实际内容):

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

我正在编写一个C#程序,允许用户在枚举值和它们关联的文本之间进行查找。换句话说,他们应该能够从值中查找文本,反之亦然。
我想知道设计用户界面的最佳方法是什么?我有几个想法:
  1. 有两个文本框。用户可以填写其中任意一个,另一个会随着用户输入自动填充。如果值无效,就将另一个文本框留空。
  2. 为用户填写信息的一侧提供一个文本框,一个单选按钮用于指定他们要向文本框填写哪些信息,一个“确定”按钮,当按下时,更新一个文本标签显示结果或错误消息。
  3. 与2相同,但不要有“确定”按钮。只需在用户输入时更新文本标签(即处理Control.KeyPress事件)。
  4. 有两个单独的屏幕(一个用于从文本搜索枚举,另一个用于从枚举搜索文本),用户可以通过选项卡或按钮在它们之间切换。为用户输入提供一个文本框、一个“确定”按钮和一个文本标签以显示结果或错误消息。
  5. 在同一屏幕上有两个单独的区域。每个区域都具有与4相同的格式。
我认为2是我从GUI应用程序中所期望的,尽管它可能有点慢,并且如果用户只输入了“S”并按下了“确定”按钮,则存在显示什么的问题。选项1比较混乱,但可能更具交互性(更快地显示答案)。
抱歉,如果这不是严格的编程问题,但我认为这是一个经常出现的UI设计问题。有人知道任何工业标准的最佳实践吗?
非常感谢。
5个回答

2
你预计列表中会有多少项?如果是一个相当小的数字,也许 <100,我会采用 Tufte 的方法,将两个设计良好的表格并排显示(一个按值排序,另一个按含义排序)。眼睛/大脑连接可以比我们意识到的更快地解析数据;我认为 Tufte 声称每只眼睛能够处理约 10Mbit/秒。
如果你拥有大量不同类型的数据,我认为 #1 是最好的选择。最少的表单控件数量,你可以通过 AJAX 或内联数组快速检索数据。确保你的指示文本非常清晰和简明。
我唯一看到这种方法的缺点是它防止用户看到相关的数据集并自行建立模式。例如,如果你告诉我 0=星期日,1=星期一,我可以合理地假设 2=星期二。如果用户了解模式,我宁愿看到他们利用它,而不是必须为每个单独的值使用表单。

谢谢您的回复。我正在谈论大约200个枚举字段,每个枚举字段有几百个项目。枚举列表中的项目没有逻辑组织。这个例子只是为了说明! - Andy
然后听起来你想要Mark的第二段话(和你的#1),至少对于有数百个可能性的字段。特别是考虑到你有200个配对。房地产必须是一个严肃的问题,你需要尽可能少的控制。我只会建议你提供一些反馈(不仅仅是一个空框)用于无效输入(例如,在文本框下面显示“无匹配项”的文本)。当用户不知道值时,你可能还需要一个小按钮打开一个窗口或页面进行搜索(我假设用户通常知道)。 - Michael Zuschlag

1

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

当用户输入时,程序会在值和文本中同时搜索并呈现部分匹配项作为建议。一旦出现匹配(完全或甚至部分),其对应物就会显示出来。因此,如果匹配是值,则相应的文本将被显示出来,反之亦然。

甚至更简单的方法是,随着每个键入字符的增加,仅显示匹配的值-文本对列表。完全不需要按Enter键。


1
+1 我喜欢这个答案(除了在难以区分值和文本的情况下)。甚至可能不需要区分部分匹配的“建议”和完全匹配 - 您可以显示多个部分匹配的对,直到出现单个明确的匹配。 - Jeff Sternal
我同意您的评论,并已在第一个窗口的设计中采纳了您的建议。 - Andy

1

我曾经使用过类似#1的解决方案。重要的是要确保您始终保持框同步,否则用户可能会将旧值误读为有效翻译。在我的情况下,只要用户开始输入(甚至粘贴)一个框中的内容,我就清除了另一个框中的内容。

这也取决于使用类型-这是否是用户经常使用并且可以允许一些学习曲线以最小化击键次数的东西,还是某个给定用户很少遇到的东西?


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;
    }

还是我误解了问题。


很抱歉,您可能误解了问题。我实际上是在寻求有关如何设计用户界面的建议和建议。示例文件仅用于说明目的 - 实际文件是一个 XML 文件,其中包含大量我们不需要的信息,难以阅读。在这种情况下,设计肯定需要先于代码! - Andy

0
非常感谢您的回答。在考虑了您所有的意见后,我已经为接口提出了一个建议。
  • 程序开始时,将加载所有枚举字段及其字段编号以及它们的枚举值的列表。
  • 初始界面将包括一个文本框和一个列表框。最初,列表框将显示所有枚举字段。当用户在文本框中输入时,与之不匹配的项目(无论是字段名称还是字段编号)将从列表框中删除。
  • 通过双击列表框上的项目(即枚举字段),或者选择该项目然后按ENTER键,将显示一个新窗口。
  • 新窗口将在一个带有两列的表格中显示所选枚举字段的所有枚举值及其相关文本。
  • 可以通过单击列来对列表进行排序。用户还应该能够使用Ctrl-F来搜索列表(希望这在C#应用程序中是允许的)。

我选择初始窗口是为了简化界面(只有1个文本框和列表框),使其易于使用。此外,我认为将枚举值一起显示并允许用户根据自己的喜好操作信息要比将所有内容隐藏在复杂的界面背后要好得多。

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

顺便说一句,目前用户需要访问网站,找到最新版本的 XML 文档,下载并打开它,然后在 XML 中搜索他们正在寻找的字段以及所需的值。我的应用程序将大大简化这些操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接