2017-05-25 1 views
0

私は、ユーザーが編集ボックスに名前を入力すると、ドロップダウンにユーザー名を入力するOutlookアドイン内にWinForms ComboBoxを持っています。ユーザーが3番目の文字に到達したとき。 ComboBoxのデータソースがこの時点で割り当てられ、カーソルは最後に留まる代わりにエディットボックスの先頭にジャンプします。入力時にWinforms ComboBoxでオートコンプリートがカーソル位置を変更するのはなぜですか?

私がしたい振る舞いは、ドロップダウンに多くのデータが入力されていても、入力中の文字列の最後にカーソルが留まることです。

私はsendキーでこれをハッキングしようとしましたが、それは必ずしも機能しません。下のキーを読み取るコードは、キー押下イベントにあります。

private void comboBox1_KeyPress(object sender, KeyEventArgs e) 
{ 
    var acceptableKeys = ConfigurationManager.AppSettings["AcceptableKeys"]; 
    if (cmbAssignedTo.Text.Length > 2 && acceptableKeys.Contains(e.KeyCode.ToString().ToUpper()) && e.Modifiers == Keys.None) 
    { 
     var request = RestHandler.CreateRequest(ConfigurationManager.AppSettings["ContactsSearchResource"] + cmbAssignedTo.Text.Trim(), Method.GET); 

     var response = RestHandler.ExecuteRequest(request, ConfigurationManager.AppSettings["myServiceURL"]); 
     this.cmbAssignedTo.DataSourceChanged -= new System.EventHandler(this.cmbAssignedTo_DataSourceChanged); 
     //Assign a new data source 
     DataHandler.UpdateComboboxDataSource(cmbAssignedTo, response.Content); 
     this.cmbAssignedTo.DataSourceChanged += new System.EventHandler(this.cmbAssignedTo_DataSourceChanged); 

    } 
    e.Handled = true; 
} 

編集

internal static void UpdateComboboxDataSource(ComboBox cmbAssignedTo, string data) 
    { 
     var list = BuildAssignmentList(data); 
     if ((list.Count() == 0 && cmbAssignedTo.Items.Count == 0) || list.Count() > 0) 
     { 
      var savedText = cmbAssignedTo.Text; 
      cmbAssignedTo.DataSource = list; 
      cmbAssignedTo.SelectedValue = ""; 
      cmbAssignedTo.Text = savedText; 
      SendKeys.Send("{end}"); 
     } 
     if (cmbAssignedTo.Items.Count > 0) 
     { 
      cmbAssignedTo.DroppedDown = true; 
      Cursor.Current = Cursors.Default; 
     } 
    } 

私はデータソースを変更せずにドロップダウンを更新することができますどのように表示されていないと、その変更は、カーソルがジャンプさせるために表示されます。私はKeyPressedとは異なるイベントを試すべきですか?私は行方不明の他の解決策はありますか?別として

+0

「cmbAssignedTo_DataSourceChanged」のコードを質問に追加してください。 –

+0

DataSourceが実際に変更されたコードを追加しました。イベントメソッド@ S.Petrosovリクエストは実際には何もしません。私はKeyPressedイベントからそれを削除します。 – Blanthor

+1

私が見つけたこの検証遅延のトリックを試してください: https://stackoverflow.com/questions/8001450/c-sharp-wait-for-user-to-finish-typing-in-a-text-boxよろしくご協力ありがとうございます。 チーム – Tim

答えて

0

あなたはコンボボックスのSelectionStartプロパティで遊ぶことができますハック:

int i = comboBox1.SelectionStart; 
comboBox1.DataSource = new System.Collections.Generic.List<string>(){"aaaaaa", "bbbbbb", "ccccccc"}; 
comboBox1.SelectionStart = i; 

このコードは、データソースを変更し、カーソル位置を保持します。カーソルを常に最後に設定する場合は、SelectionStartからcomboBox1.Text.Lengthに設定します。

UPD:

private bool cbLock = false; 

private void comboBox1_TextChanged(object sender, EventArgs e) 
{ 
    // lock is required, as this event also will occur when changing the selected index 
    if (cbLock) 
    return; 

    cbLock = true; 
    int i = comboBox1.SelectionStart; 

    // store the typed string before changing DS 
    string text = comboBox1.Text.Substring(0, i); 

    List<string> ds = new System.Collections.Generic.List<string>() { "aaaaaa", "aaabbb", "aaacccc" }; 
    comboBox1.DataSource = ds; 

    // select first match manually 
    for (int index = 0; index < ds.Count; index++) 
    { 
    string s = ds[index]; 
    if (s.StartsWith(text)) 
    { 
     comboBox1.SelectedIndex = index; 
     break; 
    } 
    } 

    // restore cursor position and free the lock 
    comboBox1.SelectionStart = i; 
    cbLock = false; 
} 

すると、それは「AAABBB」の文字列を選択し、「AAAB」と入力:「最初の項目の選択」と戦うためには、あなたは別のハックを使用することができます。

+0

これは近いですが、オートコンプリートの最初の選択肢の最後まで移動します。最初の4文字に一致する他の選択は無視されます。たとえば、マイクAとマイクBをドロップダウンで取得すると、自動的にマイクAが選択されますが、マイクBを選択できるようになります。 – Blanthor

関連する問題