我想禁用combobox
,但同时我想让用户看到其他可用选项(也就是说,我想启用dropdown
)。
默认情况下,当ComboBox.Enabled = false
时,dropdown
也会被停用(点击combobox
时没有任何反应)。
我的第一个想法是启用它并处理ComboBox.SelectedIndex event
将其设置回默认值(我只需要以某种方式将其灰显。)
我想知道是否存在我缺少的任何本机功能,或者是否有其他方法可以执行此操作。
答案 0 :(得分:4)
如果您不想使用Combobox功能,请不要使用Combobox。改为使用ListView。
答案 1 :(得分:1)
“你看到的是你无法得到的”Combobox似乎是一个坏主意。 我建议改用ListBox。
答案 2 :(得分:0)
这是一个 hacky 解决方法,但它应该完成类似于您的请求:
public partial class Form1 : Form
{
ComboBox _dummy;
public Form1()
{
InitializeComponent();
// set the style
comboBox1.DropDownStyle =
System.Windows.Forms.ComboBoxStyle.DropDownList;
// disable the combobox
comboBox1.Enabled = false;
// add the dummy combobox
_dummy = new ComboBox();
_dummy.Visible = false;
_dummy.Enabled = true;
_dummy.DropDownStyle = ComboBoxStyle.DropDownList;
this.Controls.Add(_dummy);
// add the event handler
MouseMove += Form1_MouseMove;
}
void Form1_MouseMove(object sender, MouseEventArgs e)
{
var child = this.GetChildAtPoint(e.Location);
if (child == comboBox1)
{
if (!comboBox1.Enabled)
{
// copy the items
_dummy.Items.Clear();
object[] items = new object[comboBox1.Items.Count];
comboBox1.Items.CopyTo(items, 0);
_dummy.Items.AddRange(items);
// set the size and position
_dummy.Left = comboBox1.Left;
_dummy.Top = comboBox1.Top;
_dummy.Height = comboBox1.Height;
_dummy.Width = comboBox1.Width;
// switch visibility
comboBox1.Visible = !(_dummy.Visible = true);
}
}
else if (child != _dummy)
{
// switch visibility
comboBox1.Visible = !(_dummy.Visible = false);
}
}
}
答案 3 :(得分:0)
如果使用ListBox
作为其他建议的答案不方便。有一种方法可以创建自定义组合框并添加ReadOnly
属性。试试这段代码:
class MyCombo : System.Windows.Forms.ComboBox
{
public bool ReadOnly { get; set; }
public int currentIndex;
public MyCombo()
{
currentIndex = SelectedIndex ;
}
protected override void OnSelectedIndexChanged(EventArgs e)
{
if (ReadOnly && Focused)
SelectedIndex = currentIndex;
currentIndex = SelectedIndex;
base.OnSelectedIndexChanged(e);
}
}
通常,只读控件的背景颜色不应该改变,所以我没有做过那部分。