1

我正在编写一个 Winform UI,用户必须在其中选择一个客户。(由于我无法控制的原因,我仅限于使用下拉列表、文本字段、复选框、单选按钮的 UI - 即没有花哨的特殊 UI 控件)

情况

  • 有很多客户(例如一千)
  • 如果我将所有客户放在一个下拉列表中,那么客户甚至无法轻松看到所有客户。此外,从数据库中退出所有客户以填充下拉菜单需要很长时间
  • 我的想法是有两个组合盒,第一个列表客户的姓氏,例如电话簿“ aa-ac”,“ ad-ad-ade”,“ adf-b”,在选择第一个组合盒时,它将第二个范围限定为一组可管理的客户名称(例如,不超过 40 个名称)

问题

  • 我需要一种合理的方式对他们的姓名进行分组,以便客户清楚哪个组包含该姓名。即给定一组名称,我需要将其分桶然后int“Aa-Ac”。

注释

  • 我不需要解决大量名称的一般问题 - 根据我们的数据,我们知道 1000 个名称是我们的用户将遇到的最大值。
  • 如果有其他技术,请分享,但我特别感兴趣的是关于如何确定存储桶(“Aa-Ac”等)的具体问题的答案
4

3 回答 3

0

其他技术:
我会将 ComboBox 与 TextBox 结合起来(这是您的文本字段吗?还是您的意思是只读标签?),因此用户可以输入一些第一个字母,ComboBox 将显示以这些字母开头的所有条目. 在完全匹配的情况下,它甚至可以跳过 ComboBox 的使用并加快速度。

于 2010-04-08T09:30:41.710 回答
0

Tanascious 的建议大部分都在正确的轨道上,但我不认为你没有两个组成部分。自从我进行任何 C# 开发以来已经有一段时间了,但如果我没记错的话,一个组合框(列表框?)非常适合在数百个条目之间进行选择,因为它支持按类型查找导航,即如果名称用户正在寻找的是“Doe,John”,在选择组件时键入“do”将在几乎所有情况下将用户带到几个条目中,大部分时间都是准确的用户。在公共网页上,所有内容都需要单击,但对于每天使用此界面的用户来说,这通常没有问题。

于 2010-04-08T10:01:10.107 回答
0

我认为在确定 gui 应该如何工作之前,您必须三思而后行,但如果您真的想采用桶的想法,您可以按照以下方式做一些事情:

第 1 步,创建存储桶:

  • 确定所需的桶大小(例如 40)。
  • 对名称进行排序。
  • 将前 40 个名称设为第一个存储桶,将 41-80 个名称设为第二个存储桶,依此类推,直到您创建了所有存储桶。

第 2 步,确定存储桶的“名称”(“Adf-B”等):

  • 让我们使用 bucket[i].Left 来指代第 i 个存储桶名称的左侧部分(上面的“Adf”)和 bucket[i].Right 到右侧(“B”)
  • 让我们使用 bucket[i].Names 来引用这个 bucket 中 40 个名字的列表
  • 现在假设我们有一个函数可以确定我们必须使用多少个字符来区分两个字符串(我们称之为 CharsNeeded),我们可以比较彼此相邻的桶的结束/开始并从中提取名称。

像这样:

bucket[i].Left = bucket[i].Names.First().Substring(0, CharsNeeded(bucket[i].Names.First(), bucket[i-1].Names.Last()));
bucket[i].Right = bucket[i].Names.Last().Substring(0, CharsNeeded(bucket[i].Names.Last(), bucket[i+1].Names.First()));

CharsNeeded 可以像这样实现,例如:

int CharsNeeded(string str1, string str2)
{
  int i=0;
  while (i < str1.Length && i < str2.Length && str1[i] == str2[i])
    i++;
  return i + 1;
}

另外,请注意边缘情况,因为我没有检查存储桶数组上的索引是否超出范围。

于 2010-04-08T10:04:41.233 回答