如何使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); } } }
代码中最简单的方法 :
而不是为KeyPress
或KeyDown
添加方法,请在“ 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 ”!