1

ユーザーが単一の顧客を選択する必要がある Winform UI を作成しています。(私の手に負えない理由で、ドロップダウン リスト、テキスト フィールド、チェックボックス、ラジオボタンのみを使用する UI に制限されています。つまり、凝った特別な UI コントロールはありません)

状況

  • 顧客数が多い(例:1000人)
  • すべての顧客を単一のドロップダウンに入れると、顧客がすべての顧客を簡単に見ることさえできなくなります。また、DB からすべての顧客を取得してドロップダウンに入力するには時間がかかりすぎます。
  • 私の考えでは、2 つのコンボ ボックスがあり、最初のコンボ ボックスを選択すると、電話帳「Aa-Ac」、「Ad-Ade」、「Adf-B」のような名前で顧客のグループが最初にリストされます。 2番目のものを管理可能なセットの顧客名にスコープします(たとえば40名以下)

質問

  • どのグループに名前が含まれているかが顧客に明確になるように、名前をグループ化する合理的な方法が必要です。つまり、バケット化する必要がある名前のグループが与えられたら、「Aa-Ac」を int にします。

コメント

  • 膨大な数の名前の一般的な問題を解決する必要はありません。データに基づいて、ユーザーが遭遇する名前の最大数は 1000 であることがわかっています。
  • 他の手法がある場合は共有してください。ただし、バケット (「Aa-Ac」など) を決定する方法に関する特定の質問への回答に特に関心があります。
4

3 に答える 3

0

Tanascious の提案はほぼ正しい方向に進んでいますが、2 つのコンポーネントがないとは思いません。私が C# 開発を行ってからしばらく経ちましたが、私の記憶が正しければ、1 つのコンボボックス (リストボックス?) は、入力時に検索ナビゲーションをサポートしているため、何百ものエントリから選択するのに非常に適しています。ユーザーが探しているのは「Doe, John」です。コンポーネントが選択されているときに「do」と入力すると、ほとんどの場合、2 つのエントリ内にユーザーが表示され、ほとんどの場合、正確なユーザーが表示されます。すべてをクリックする必要がある公共の Web ページでは最適とは言えませんが、このインターフェイスを日常的に使用しているユーザーにとっては、通常は問題ありません。

于 2010-04-08T10:01:10.107 に答える
0

その他のテクニック:
ComboBox と TextBox を組み合わせて (これはテキスト フィールドですか? それとも、読み取り専用のラベルですか?)、ユーザーが最初の文字をいくつか入力すると、ComboBox はこれらの文字で始まるすべてのエントリを表示します。 . 完全一致の場合は、ComboBox の使用をスキップして処理を高速化することもできます。

于 2010-04-08T09:30:41.710 に答える
0

GUI がどのように動作するかを決定する前に、1 回か 2 回考える必要があると思いますが、本当にバケツのアイデアを採用したい場合は、次の行に沿って何かを実行します。

ステップ 1、バケットを作成します。

  • 希望するバケット サイズを決定します (例として 40 とします)。
  • 名前を並べ替えます。
  • すべてのバケットを作成するまで、最初の 40 個の名前を最初のバケットに、41 ~ 80 個の名前を 2 番目のバケットにします。

ステップ 2、バケットの「名前」を決定します (「Adf-B」など)。

  • bucket[i].Left を使用して、i 番目のバケット名 (上記の「Adf」) の左側の部分を参照し、bucket[i].Right を右側 (「B」) に参照します。
  • bucket[i].Names を使用して、このバケット内の 40 個の名前のリストを参照します
  • 2 つの文字列を区別するために使用する必要がある文字数を決定できる関数があると仮定すると (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 に答える