我正在构建一个具有正常着色的Windows窗体组合框,并允许显示下拉列表,但不允许值实际更改。据我所知,这不是How to make Combobox in winforms readonly的重复,因为那里的所有建议似乎都是为了禁用组合框的交互性。
我的理由:我有一个表单,其中所有控件都是只读的,并且由于应用程序的性质,我认为当组合框的值没有改变时,用户不会感到困惑。我希望用户能够看到组合框绑定的枚举的所有可能值。
到目前为止我所做的是一个非常糟糕的黑客:
public partial class ReadOnlyComboBox : ComboBox
{
int prevIndex = -1;
public ReadOnlyComboBox()
{
InitializeComponent();
}
private void ReadOnlyComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
if (prevIndex <= 0)
prevIndex = SelectedIndex;
else
SelectedIndex = prevIndex;
}
}
实际上,这会从框架中忽略虚假的“0”值,并获取从绑定源获取的第一个非零值。直接的缺点是该值只能设置一次,并且绑定的枚举必须从1开始。
欢迎任何有关清理此事的建议。感谢。
答案 0 :(得分:1)
使用DropDownClosed事件
public class ReadOnlyComboBox : ComboBox
{
bool afterDropDown ;
int prevIndex;
public ReadOnlyComboBox()
{
this.SelectedIndexChanged+=new EventHandler(ReadOnlyComboBox_SelectedIndexChanged);
this.DropDownClosed += new EventHandler(ReadOnlyComboBox_DropDownClosed);
}
void ReadOnlyComboBox_DropDownClosed(object sender, EventArgs e)
{
afterDropDown = true;
}
private void ReadOnlyComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
if (afterDropDown)
{
afterDropDown = false;
SelectedIndex = prevIndex;
}
else
{
prevIndex = SelectedIndex;
}
}
}