class HistComboBox : ComboBox { public HistComboBox() { this.MaxHistoryCount = 10; } public void SaveHistory() { // 自動補完が有効になっていない場合は処理しない if (AutoCompleteMode == AutoCompleteMode.None) return; // 自動補完元がリスト項目またはカスタム項目になっていない場合は処理しない。 // 自動補完元がリスト項目の場合、DataSourceを使用している場合は処理しない。 if (AutoCompleteSource != AutoCompleteSource.CustomSource && (AutoCompleteSource != AutoCompleteSource.ListItems || DataSource != null)) return; // 入力値の取得と履歴化の補正 var inputed = Text; var handler = AddingHistory; var history = new AddingHistoryEventArgs { AddingHistory = inputed }; if (handler != null) handler(this, history); if (history.AddingHistory == null) return; if (AutoCompleteSource == AutoCompleteSource.ListItems) { // 自動補完元がリスト項目の場合 if (Items.Contains(history.AddingHistory)) Items.Remove(history.AddingHistory); Items.Insert(0, history.AddingHistory); while (Items.Count > 0 && Items.Count > MaxHistoryCount) Items.RemoveAt(Items.Count - 1); } else if (AutoCompleteSource == AutoCompleteSource.CustomSource) { // 自動補完元がカスタム項目の場合 if (AutoCompleteCustomSource == null) return; if (AutoCompleteCustomSource.Contains(history.AddingHistory)) AutoCompleteCustomSource.Remove(history.AddingHistory); AutoCompleteCustomSource.Insert(0, history.AddingHistory); while (AutoCompleteCustomSource.Count > 0 && AutoCompleteCustomSource.Count > MaxHistoryCount) AutoCompleteCustomSource.RemoveAt(AutoCompleteCustomSource.Count - 1); } // 入力値の戻し Text = history.AddingHistory; } protected override void OnValidated(EventArgs e) { base.OnValidated(e); // フォーカスの移動先を取得 var form = FindForm(); if (form == null) return; var focused = form.ActiveControl; SaveHistory(); // フォーカスの移動 form.ActiveControl = focused; } public class AddingHistoryEventArgs : EventArgs { public string AddingHistory { get; set; } } public event EventHandler AddingHistory; [DefaultValue(10)] public int MaxHistoryCount { get; set; }