私のWinFormsアプリケーションには、デフォルト値を持つComboBoxがあります。ユーザーは、ComboBoxにアイテムを追加したり、既存のアイテムの名前を変更したりできる必要があります。
デザインを単純化してほしい。これは私の最初のアプローチでした:
ユーザーがComboBoxに何かを入力してEnterキーを押し、アイテムが存在する場合は、それを選択します。アイテムが存在しない場合は追加してください。
ユーザーがEnterキーを押したときにComboBoxが空の場合は、現在のインデックスにあるアイテムを削除します。
次の2つの問題を除いて、これは問題なく機能しました。
これはカスタムユーザーインターフェイスコントロールであるため、機能は直感的ではありません。
ユーザーがComboBoxからアイテムを削除し、その後にアイテムがある場合、それに応じてインデックスが調整されます。基本的に、そのアイテムの後のすべてのアイテムインデックスは1に下げられます。これは悪いことです。一度アイテムが追加されると、他のサービスがそれに依存している可能性があるため、そのインデックスを変更するべきではありません。基本的に、アイテムの削除は許可されるべきではありません。名前のみ変更されました。それらが不要になった場合は、おそらく空白にします。
私が考えることができる唯一の本当の解決策は、個別のダイアログを用意することですが、ダイアログの適切な設計を想像することはできません。
以下は、最初に考えられる実装の例です。
ComboBoxの項目を追加または名前を変更する目的で、メニュー項目がダイアログを開くようにします。
このダイアログウィンドウのComboBoxのすべての項目にTextBoxを配置します。最後のTextBoxが空でない場合は、別のTextBoxを追加します(または別のTextBoxを追加するためのボタンがあります)。
このアプローチは問題ないと思いますが、いくつかの理由でそれは好きではありません。
ユーザーがComboBoxに多くのアイテムを持っている場合、ダイアログウィンドウは巨大になるか、スクロールバーが必要になります。
このアプローチには、メニュー項目、対応するダイアログウィンドウ、および大量の潜在的な動的コントロールが必要です。
私はこれにアプローチするためのより良い方法を考えていましたが、運がありません。
ComboBoxを使用しているため、作成されていません。 ComboBoxは、アイテムの固定リストをselectに格納します。このリストを編集する必要がある場合は、別のフォームを使用してアイテムを編集してください。より直感的で信頼できるでしょう。それ以外の場合は、たとえばグリッドを使用してください。より「編集可能」です。
あなたが探しているのは(私が思うに)オートコンプリートテキストボックスです。
これにより、ユーザーは任意のテキストを追加できますが、入力を事前定義されたリストと照合し、ユーザーはそのリストから項目の1つを選択できます。これは、ユーザーが州または国を入力する必要がある場合に表示されます。
あなたのケースでは、リストにまだない入力をリストに追加したい-これは可能です。
削除するという要件も可能ですが、使用する電子メールの受信者を入力するときに同様の機能を持つOutlookでは Shift+Delete アイテムを削除します。
このブログ投稿 は、WinFormsで作成する方法の例を示しています。必要がないため、ここではコードを繰り返しません。
この遅い日でさえ、この投稿はまだ役に立ちます。ユーザーがComboBoxコントロールに入力したアイテムを追加するには、
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);
}
}
}
私はこれをテストしたところ、うまく機能しているようです!