2016-10-25 5 views
1

У меня есть ComboBox с DropDownStyle DropDown, размер которого изменяется каждый раз, когда изменяется размер окна. Если в ComboBox есть хотя бы один элемент, и он выбирается, изменение размера ComboBox выбирает весь текст, сдувая предыдущий выбор текста пользователя. Это также происходит, когда окно теряет фокус, а затем восстанавливает его. Кто-нибудь понял способ предотвратить это, или восстановить выбор текста после этого?Предотвратить изменение размера при выборе всего текста в сфокусированном ComboBox

The user selects some text......and it is blown away when the ComboBox is resized.

This question описывает связанную проблему нечеткости ComboBoxes и содержит решение, которое сбрасывает SelectionLength до 0 после события Resize. Это событие было бы хорошим кандидатом для восстановления текста, но я не уверен, как получить выбор текста до он был удален от изменения размера.

ответ

0

, но я не уверен, как получить выделение текста, прежде чем он был сдувается изменения размера

Вы можете собрать это в виде ResizeBegin события.

private int _start; 
private int _length; 

private void Form1_ResizeBegin(object sender, EventArgs e) 
{ 
    _start = comboBox1.SelectionStart; 
    _length = comboBox1.SelectionLength; 
} 

private void Form1_ResizeEnd(object sender, EventArgs e) 
{ 
    comboBox1.SelectionStart = _start; 
    comboBox1.SelectionLength = _length; 
} 

Или постоянно установить его обратно, когда выпадающий изменяет размер (также может быть сделано в форме изменения размера само событие для грубой, зависит, как вам нравится). С помощью этой опции пользователь не увидит никаких изменений. В приведенном выше примере весь текст будет выбран при изменении размера формы. В нижнем случае это не будет.

private int _start; 
private int _length; 

private void Form1_ResizeBegin(object sender, EventArgs e) 
{ 
    _start = comboBox1.SelectionStart; 
    _length = comboBox1.SelectionLength; 
} 

private void comboBox1_Resize(object sender, EventArgs e) 
{ 
    comboBox1.SelectionStart = _start; 
    comboBox1.SelectionLength = _length; 
} 

В качестве альтернативы вы можете сделать это для различных событий, например, когда форма теряет фокус и т.д.

private int _start;  
private int _length; 

private void Form1_ResizeBegin(object sender, EventArgs e) 
{ 
    SaveComboBoxSelectionState(comboBox1); 
} 

private void comboBox1_Resize(object sender, EventArgs e) 
{ 
    SetComboBoxSelection(comboBox1, _start, _length); 
} 

private void Form1_Deactivate(object sender, EventArgs e) 
{   
    SaveComboBoxSelectionState(comboBox1); 
} 

private void Form1_Activated(object sender, EventArgs e) 
{ 
    SetComboBoxSelection(comboBox1, _start, _length); 
} 

private void SaveComboBoxSelectionState(ComboBox comboBox) 
{ 
    _start = comboBox.SelectionStart; 
    _length = comboBox.SelectionLength; 
} 

private void SetComboBoxSelection(ComboBox comboBox, int start, int length) 
{ 
    comboBox.SelectionStart = start; 
    comboBox.SelectionLength = length; 
} 
Смежные вопросы