Sé que estoy un poco tarde a la fiesta, pero yo estaba investigando esta pregunta exacta y sabía que tenía que haber alguna manera de hacer que el cuadro combinado de sólo lectura, como si se tratara de un cuadro de texto y desactivado el lista apareciendo. No es perfecto, pero definitivamente es mejor que todas las respuestas que he encontrado en Internet que no me funcionan. Después de que se presiona el botón y se llama a OnDropDown, se crea un nuevo subproceso que establecerá la propiedad DroppedDown en falso, creando así el efecto de "no pasar nada". La rueda del mouse se consume y los eventos clave se consumen también.
using System;
using System.Threading;
using System.Windows.Forms;
namespace Test_Application
{
class ReadOnlyComboBox : ComboBox
{
private bool _readOnly;
private bool isLoading;
private bool indexChangedFlag;
private int lastIndex = -1;
private string lastText = "";
public ReadOnlyComboBox()
{
}
public bool ReadOnly
{
get { return _readOnly; }
set { _readOnly = value; }
}
protected override void OnDropDown(EventArgs e)
{
if (_readOnly)
{
DropDownHeight = 1;
var t = new Thread(CloseDropDown);
t.Start();
return;
}
base.OnDropDown(e);
}
private delegate void CloseDropDownDelegate();
private void WaitForDropDown()
{
if (InvokeRequired)
{
var d = new CloseDropDownDelegate(WaitForDropDown);
Invoke(d);
}
else
{
DroppedDown = false;
}
}
private void CloseDropDown()
{
WaitForDropDown();
}
protected override void OnMouseWheel(MouseEventArgs e)
{
if (!_readOnly)
base.OnMouseWheel(e);
}
protected override void OnKeyDown(KeyEventArgs e)
{
if (_readOnly)
{
switch (e.KeyCode)
{
case Keys.Back:
case Keys.Delete:
case Keys.Up:
case Keys.Down:
e.SuppressKeyPress = true;
return;
}
}
base.OnKeyDown(e);
}
protected override void OnKeyPress(KeyPressEventArgs e)
{
if (_readOnly)
{
e.Handled = true;
return;
}
base.OnKeyPress(e);
}
}
}
Votación acentuado porque: La respuesta no es realmente útil. El control de combobox estándar ya proporciona la funcionalidad deseada como señaló @amar vashi. – Andreas