2013-11-27 1 views
0

Я знаю команду в wpf, но каков ее эквивалент в winform?Как отключить операцию чтения из combobox в winform?

 cboclient.IsHitTestVisible = false; 
     cboclient.Focusable = false; 

С помощью этой команды комбо-бокс не отключается, но пользователь не могу открыть его для чтения данных .Как я могу выполнить это в winfrom? спасибо

Подробности: У меня есть 3 combobox на моей форме, когда форма изначально загружает единственную третью выпадающую ячейку, которую нельзя открыть для чтения данных. Когда пользователь выбирает значение в первых двух combobox, тогда на основе этих двух значений, третье поле со списком позволяет отображать данные из db.

Примечание: Здесь я не хочу отключать третью combobox. Потому что это даст пользователю ложное выражение.

+0

Вы пробовали 'cboclient.Enabled = false;'? –

+0

yes .... Это отключает Combobox – user3012262

+0

И это не то, что вы хотите? Пожалуйста, опишите, что вы после ... –

ответ

0

Вы можете использовать следующий код:

cboclient.DropDownStyle = ComboBoxStyle.DropDownList; 
cboclient.DropDownHeight = 1; 
cboclient.DropDownWidth = 1; 
cboclient.TabStop = false; 

для отображения выпадающего как только для чтения, который вы можете использовать:

cboclient.FlatStyle = FlatStyle.Popup; 

или

cboclient.FlatStyle = FlatStyle.Flat; 
0

Вы можете использовать если заявления на событие OnSelectionChangedSelectionChanged.

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     //here your if statement 
    } 
1

Вы можете поймать сообщение WM_MOUSEACTIVATE и отбросить его, чтобы предотвратить пользователя от фокусирования выпадающий с помощью мыши, а также предотвратить hittesting. Поймайте сообщение WM_SETFOCUS, чтобы пользователь не мог сфокусировать выделение на клавиатуре. Попробуйте использовать этот код:

public class ComboBoxEx : ComboBox 
{  
    public ComboBoxEx(){ 
     IsHitTestVisible = true; 
    } 
    public bool IsHitTestVisible { get; set; } 
    public bool ReadOnly { get; set; } 
    protected override void WndProc(ref Message m) 
    {    
     if (!IsHitTestVisible) 
     { 
      if (m.Msg == 0x21)//WM_MOUSEACTIVATE = 0x21 
      { 
       m.Result = (IntPtr)4;//no activation and discard mouse message 
       return; 
      } 
      //WM_MOUSEMOVE = 0x200, WM_LBUTTONUP = 0x202 
      if (m.Msg == 0x200 || m.Msg == 0x202) return; 
     } 
     //WM_SETFOCUS = 0x7 
     if (ReadOnly && m.Msg == 0x7) return; 
     base.WndProc(ref m); 
    } 
    //Discard key messages 
    public override bool PreProcessMessage(ref Message msg) 
    { 
     if (ReadOnly) return true; 
     return base.PreProcessMessage(ref msg); 
    } 
} 
//Usage 
comboBoxEx1.ReadOnly = true; 
comboBoxEx1.IsHitTestVisible = false; 
+0

Отличный ответ. Он показывает, как то, что достигается при установке двух свойств в WPF, требует кучу ужасных хаков, полных магических чисел и причудливых вещей повсюду в winforms. –

+0

@HighCore да, я думаю, что это достаточно актуально, чтобы быть помещенным в вашу коллекцию, однако это не вид дна winforms, там много гораздо более сложных кодов, все эти сложные коды можно сделать намного проще с WPF , это не странно, потому что WPF - это библиотека более высокого уровня, а следующая технология пользовательского интерфейса: | –

+0

что действительно отвратительно об этом - все эти '0x200',' 0x202' ... что это такое? Почему они не создают freakin 'enum' или что-то еще? Похоже, что вернуться к дням VB6, взаимодействующим с API Windows 95 –

Смежные вопросы