2

我有几个具有相同属性的组合框。

Dropdownstyle : Dropdownlist
AutoCompleteMode: SuggestAppend
AutoCompleteSource: ListItems

例如,我有一个下拉列表 cboxStates,其中手动输入了美国的 50 个州。当我输入 WI 时,它会在 WA、WV、WI、WY 中突出显示,但如果我在另一个控件上按 Tab/按 Enter/鼠标单击,则会选择 WA 而不是突出显示的 WI。这是完全随机的,它发生在动态绑定的组合框上。而且,他们没有任何事件。

4

1 回答 1

1

这似乎是已提交给Connect的问题。有一个解决方法可以扩展默认的 ComboBox 控件并解决问题。扩展的 ComboBox 代码在 Connect 站点上的格式非常糟糕,所以这里是更好的版本 :)

public class BetterComboBox : ComboBox 
{
    private int _windows7CorrectedSelectedIndex = -1;
    private int? _selectedIndexWhenDroppedDown = null; 

    protected override void OnDropDown(EventArgs e)
    {  
        _selectedIndexWhenDroppedDown = SelectedIndex;    
        base.OnDropDown(e);
    }

    private bool _onDropDownClosedProcessing = false; 

    protected override void OnDropDownClosed(EventArgs e) 
    { 
        if (_selectedIndexWhenDroppedDown != null && _selectedIndexWhenDroppedDown != SelectedIndex)   
        {    
            try   
            {      
                _onDropDownClosedProcessing = true;     
                OnSelectionChangeCommitted(e);   
            }    
            finally   
            { 
                _onDropDownClosedProcessing = false;   
            }   
        }   
        base.OnDropDownClosed(e);   
        if (SelectedIndex != _windows7CorrectedSelectedIndex)   
        {  
            SelectedIndex = _windows7CorrectedSelectedIndex;      
            OnSelectionChangeCommitted(e);  
        }
    } 

    protected override void OnSelectionChangeCommitted(EventArgs e)
    {   
        if (!_onDropDownClosedProcessing)
            _windows7CorrectedSelectedIndex = SelectedIndex;    
        _selectedIndexWhenDroppedDown = null; 
        base.OnSelectionChangeCommitted(e); 
    } 

    protected override void OnSelectedIndexChanged(EventArgs e)
    {  
        bool alreadyMatched = true;   
        if (_windows7CorrectedSelectedIndex != SelectedIndex)  
        {  
            _windows7CorrectedSelectedIndex = SelectedIndex; 
            alreadyMatched = false; 
        }   
        base.OnSelectedIndexChanged(e);  

        //when not dropped down, the SelectionChangeCommitted event does not fire upon non-arrow keystrokes due (I suppose) to AutoComplete behavior   
        //this is not acceptable for my needs, and so I have come up with the best way to determine when to raise the event, without causing duplication of the event (alreadyMatched)   
        //and without causing the event to fire when programmatic changes cause SelectedIndexChanged to be raised (_processingKeyEventArgs implies user-caused)   
        if (!DroppedDown && !alreadyMatched && _processingKeyEventArgs)
            OnSelectionChangeCommitted(e); 
    } 

    private bool _processingKeyEventArgs = false;

    protected override bool ProcessKeyEventArgs(ref Message m)
    {  
        try   
        {   
            _processingKeyEventArgs = true; 
            return base.ProcessKeyEventArgs(ref m);  
        }  
        finally 
        { 
            _processingKeyEventArgs = false;  
        } 
    }
} 
于 2013-04-18T20:55:12.713 回答