防止调整焦点选择聚焦ComboBox中的所有文本

时间:2016-10-25 02:25:11

标签: c# .net winforms combobox

我有一个DropDown DropDownStyle的ComboBox,只要调整窗口大小,就会调整大小。如果ComboBox中至少有一个项目被选中,则调整ComboBox的大小会选择所有文本,从而消除用户之前的文本选择。当窗口失去焦点然后重新获得焦点时,也会发生这种情况。有没有人想出办法防止这种情况发生,或者在发生这种情况后恢复文本选择?

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

This question描述了未聚焦的ComboBox的相关问题,并包含一个在Resize事件后将SelectionLength重置为0的解决方案。此活动是恢复文本选择的理想候选地点,但我不确定如何在之前获取文本选择它被调整大小吹走了。

1 个答案:

答案 0 :(得分: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;
}