如何使winbox中的Combobox只读

我不希望用户能够更改combobox中显示的值。 我一直在使用Enabled = false但是灰色的文字,所以它不是很可读。 我希望它的行为像一个ReadOnly = true的文本框,其中的文本正常显示,但用户不能编辑它。

有没有办法完成这个?

ComboBox-read-only行为文章提出了一个有趣的解决scheme:

在同一个地方创build一个只读文本框和一个combobox。 当你想要只读模式时,显示文本框,当你想要它是可编辑的,显示combobox。

使DropDownStyle属性DropDownList而不是DropDown然后处理TextChanged事件,以防止用户更改文本。

我build议的最好的方法是用只读文本框(或者只是一个标签)replacecombobox – 这样用户仍然可以select/复制值等。

当然,另一个厚脸皮的策略是将DropDownStyle设置为DropDownList ,并删除所有其他选项 – 然后用户没有别的select; -p

不知道这是你在找什么,但…

设置DropDownStyle = DropDownList

然后在SelectedIndexChanged事件上

 If (ComboBox1.SelectedIndex <> 0) { ComboBox1.SelectedIndex = 0 } 

这个丑陋的部分是他们会“感觉到”可以改变它。 他们可能会认为这是一个错误,除非你给他们一个警告,告诉他们为什么他们不能改变价值。

我已经通过inheritanceComboBox的方式来添加一个ReadOnly属性,该属性在设置时隐藏自身,并在顶部显示包含相同Text的ReadOnly TextBox:

 class ComboBoxReadOnly : ComboBox { public ComboBoxReadOnly() { textBox = new TextBox(); textBox.ReadOnly = true; textBox.Visible = false; } private TextBox textBox; private bool readOnly = false; public bool ReadOnly { get { return readOnly; } set { readOnly = value; if (readOnly) { this.Visible = false; textBox.Text = this.Text; textBox.Location = this.Location; textBox.Size = this.Size; textBox.Visible = true; if (textBox.Parent == null) this.Parent.Controls.Add(textBox); } else { this.Visible = true; this.textBox.Visible = false; } } } } 

在这里input链接描述

只要将DropDownStyle改为DropDownList 。 或者如果你想完全读取,你可以设置Enabled = false ,或者如果你不喜欢的表情,我有时有两个控件,一个只读文本框和一个combobox,然后隐藏combobox,并显示文本框,如果它应该完全只读,反之亦然。

您可以将前景色和背景色更改为已启用combobox的系统颜色,但这可能会让用户感到困惑(为什么如果他们无法更改它),则效果会更好。

这是ReadOnly组合的最佳解决scheme。

 private void combo1_KeyPress(object sender, KeyPressEventArgs e) { e.KeyChar = (char)Keys.None; } 

它将放弃Combo的按键。

这是你如何解决这个事实,一个ComboBox Enabled = False难以阅读:

禁用时看起来不错的combobox

迈克尔R的代码工程,但…“DropDownHeight = 1;” 当ReadOnly属性设置为false时,必须回到默认值。 所以,在“base.OnDropDown(e)”之前插入:DropDownHeight = 106;

 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; } DropDownHeight = 106; //Insert this line. 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); } } } 

要完成此答案:文件 – 新build – 项目… – Visual C# – Windows – 经典桌面 – Windows窗体控制库 – 键入您的控件的名称 – 确定并粘贴此代码。 您可以select您的dll文件的名称:项目 – 您的项目属性… – 程序集名称 – input名称。 只是build立解决scheme,你有你的dll文件。 所以,打开你想要使用你的只读组合的项目,右键点击References – Add Reference …并浏览你的dll文件。 要将自定义组件插入到工具箱中,请打开工具箱,右键单击常规选项卡 – select项目… – 浏览您的dll文件 – 打开。 现在你可以在你的项目中使用你的ReadOnlyComboBox。 PS:我正在使用VS2015。

你为什么不使用文本框? 文本框有一个“只读”属性,因为你想要你的combobox只显示数据,我不明白你为什么需要一个combobox。

另一种方法就是取消“改变值”事件的input。 这样,你将显示你的信息无论用户做什么…

其实,它相当简单:

 Private Sub combobox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles combobox1.KeyDown ' the following makes this the combobox read only e.SuppressKeyPress = True End Sub 

DropdownStyle属性设置为Simple

将以下代码添加到ComboBox的KeyPress事件中

 private void comboBoxName_KeyPress(object sender, KeyPressEventArgs e) { e.Handled = true; return; } 

将以下代码添加到ComboBox的KeyDown事件中

 private void comboBoxName_KeyDown(object sender, KeyEventArgs e) { e.Handled = true; return; } 

如果已经填充了它,并select了相应的项目,并将其设置为DropDownList ,那么可以使用这样的扩展方法将select列表快速减less到所选项目:

 public static void MakeReadOnly(this ComboBox pComboBox) { if (pComboBox.SelectedItem == null) return; pComboBox.DataSource = new List<object> { pComboBox.SelectedItem }; } 

我知道我晚了一点,但是我正在研究这个确切的问题,我知道必须有一些方法来使combobox只读,就好像它是一个文本框,并禁用popup列表。 这不是完美的,但它肯定比我在互联网上find的所有答案都好,这些答案对我不起作用。 按下button并调用OnDropDown后,会创build一个新的线程,将DroppedDown属性设置为false,从而创build“没有任何事情”的效果。 鼠标滚轮消耗,关键事件也消耗。

 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); } } } 

代码中最简单的方法

而不是为KeyPressKeyDown添加方法,请在“ Form1_Load ”方法中添加以下代码:

comboBox1.KeyPress += (sndr, eva) => eva.Handled = true;

要么

comboBox1.KeyDown += (sndr, eva) => eva.SuppressKeyPress = true;

(sndr, eva)是for (object sender, EventArgs e)

这是ReadOnly组合的最佳解决scheme。

 private void combo1_KeyPress(object sender, KeyPressEventArgs e) { e.KeyChar = (char)Keys.None; } 

它将放弃Combo的按键。 它没有“ e。KeyChar ”!