2

同じプロパティを持つコンボボックスがいくつかあります。

Dropdownstyle : Dropdownlist
AutoCompleteMode: SuggestAppend
AutoCompleteSource: ListItems

たとえば、Items コレクションにアメリカ合衆国の 50 州が手動で入力されたドロップダウンリスト cboxStates があります。WI と入力すると、WA、WV、WI、WY の間で強調表示されますが、別のコントロールでタブ オーバー/Enter キーを押す/マウス クリックすると、強調表示されている WI の代わりに WA が選択されます。これは完全にランダムで、動的にバインドされたコンボボックスで発生します。また、イベントはありません。

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 に答える