web-dev-qa-db-ja.com

ユーザーがComboBoxの項目を追加および編集できるようにするにはどうすればよいですか? (WinForms)

私のWinFormsアプリケーションには、デフォルト値を持つComboBoxがあります。ユーザーは、ComboBoxにアイテムを追加したり、既存のアイテムの名前を変更したりできる必要があります。

デザインを単純化してほしい。これは私の最初のアプローチでした:

  • ユーザーがComboBoxに何かを入力してEnterキーを押し、アイテムが存在する場合は、それを選択します。アイテムが存在しない場合は追加してください。

  • ユーザーがEnterキーを押したときにComboBoxが空の場合は、現在のインデックスにあるアイテムを削除します。

次の2つの問題を除いて、これは問題なく機能しました。

  1. これはカスタムユーザーインターフェイスコントロールであるため、機能は直感的ではありません。

  2. ユーザーがComboBoxからアイテムを削除し、その後にアイテムがある場合、それに応じてインデックスが調整されます。基本的に、そのアイテムの後のすべてのアイテムインデックスは1に下げられます。これは悪いことです。一度アイテムが追加されると、他のサービスがそれに依存している可能性があるため、そのインデックスを変更するべきではありません。基本的に、アイテムの削除は許可されるべきではありません。名前のみ変更されました。それらが不要になった場合は、おそらく空白にします。

私が考えることができる唯一の本当の解決策は、個別のダイアログを用意することですが、ダイアログの適切な設計を想像することはできません。

以下は、最初に考えられる実装の例です。

  1. ComboBoxの項目を追加または名前を変更する目的で、メニュー項目がダイアログを開くようにします。

  2. このダイアログウィンドウのComboBoxのすべての項目にTextBoxを配置します。最後のTextBoxが空でない場合は、別のTextBoxを追加します(または別のTextBoxを追加するためのボタンがあります)。

このアプローチは問題ないと思いますが、いくつかの理由でそれは好きではありません。

  1. ユーザーがComboBoxに多くのアイテムを持っている場合、ダイアログウィンドウは巨大になるか、スクロールバーが必要になります。

  2. このアプローチには、メニュー項目、対応するダイアログウィンドウ、および大量の潜在的な動的コントロールが必要です。

私はこれにアプローチするためのより良い方法を考えていましたが、運がありません。

6
Andrew Pollack

ComboBoxを使用しているため、作成されていません。 ComboBoxは、アイテムの固定リストをselectに格納します。このリストを編集する必要がある場合は、別のフォームを使用してアイテムを編集してください。より直感的で信頼できるでしょう。それ以外の場合は、たとえばグリッドを使用してください。より「編集可能」です。

1
igor

あなたが探しているのは(私が思うに)オートコンプリートテキストボックスです。

これにより、ユーザーは任意のテキストを追加できますが、入力を事前定義されたリストと照合し、ユーザーはそのリストから項目の1つを選択できます。これは、ユーザーが州または国を入力する必要がある場合に表示されます。

あなたのケースでは、リストにまだない入力をリストに追加したい-これは可能です。

削除するという要件も可能ですが、使用する電子メールの受信者を入力するときに同様の機能を持つOutlookでは Shift+Delete アイテムを削除します。

このブログ投稿 は、WinFormsで作成する方法の例を示しています。必要がないため、ここではコードを繰り返しません。

0
ChrisF

この遅い日でさえ、この投稿はまだ役に立ちます。ユーザーがComboBoxコントロールに入力したアイテムを追加するには、

  1. ComboBoxを選択します(Visual Studioではデザインモードです)。
  2. そのプロパティを表示します。
  3. [イベント]ビューを選択します。
  4. KeyDownイベントメソッドを追加します。
  5. keyDownイベントのメソッドで、KeyEventArgs e.KeyCodeを確認します。ユーザーがEnterキー(Keys.Enter)を押した場合、アイテムが既にアイテムリストにあるかどうかを確認します。

    private void cmbUserNouns_KeyDown(object sender、KeyEventArgs e){

    文字列s = cmbUserNouns.Text;

    if(e.KeyCode == Keys.Enter)

    {

    //アイテムが存在する場合、それを選択します。存在しない場合は追加してください。

    if(!cmbUserNouns.Items.Contains(s))

    {

    cmbUserNouns.Items.Add(s);

    }

    }

}

私はこれをテストしたところ、うまく機能しているようです!

0
Su Llewellyn