经过很长一段时间后回到VS2008中的WinForms ..修补VS2008 Express Edition中的OOD问题。
我需要一些控件才能成为“仅显示”小部件。用户不应该能够更改这些控件的值...小部件由定期更新tick事件更新。我依稀记得有一个ReadOnly属性,你可以设置为有这种行为......现在找不到它。
已启用属性设置为false:灰显控件内容。我希望控件看起来很正常。 已锁定属性设置为false:似乎是在保护用户免于意外扭曲Visual Form Designer中的控件。
我错过了什么?
答案 0 :(得分:11)
对于一些典型的winforms控件:
http://jquiz.wordpress.com/2007/05/29/c-winforms-readonly-controls/
这也是保护外观的好建议:
Color clr = textBox1.BackColor;
textBox1.ReadOnly = true;
textBox1.BackColor = clr;
答案 1 :(得分:4)
要在一次单击时立即使表单控制只读,请使用以下代码:
public void LockControlValues(System.Windows.Forms.Control Container)
{
try
{
foreach (Control ctrl in Container.Controls)
{
if (ctrl.GetType() == typeof(TextBox))
((TextBox)ctrl).ReadOnly = true;
if (ctrl.GetType() == typeof(ComboBox))
((ComboBox)ctrl).Enabled= false;
if (ctrl.GetType() == typeof(CheckBox))
((CheckBox)ctrl).Enabled = false;
if (ctrl.GetType() == typeof(DateTimePicker))
((DateTimePicker)ctrl).Enabled = false;
if (ctrl.Controls.Count > 0)
LockControlValues(ctrl);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
然后从您的按钮点击事件中调用它,如下所示:
LockControlValues(this)
希望,这有助于解决您的问题:
快乐编程,
Rajan Arora www.simplyrajan.co.nr答案 2 :(得分:3)
<强>文本框强>
.ReadOnly属性为true
没有ReadOnly的控件
其他控件并不总是具有ReadOnly属性。您需要使用活动来取消编辑过程并保持您的价值不可编辑。
答案 3 :(得分:1)
两个相关属性ReadOnly和Enabled。 ReadOnly = true可防止编辑背景灰色,但仍允许焦点。 Enabled = false使背景,文本灰显并阻止编辑或聚焦。
Windows UI惯例指明为用户提供一个控件是只读的可视提示(这样他们就不会尝试编辑它并随后受挫)。灰显的禁用状态是定义的系统约定,但它可以说太多的提示(而不是一个足够的legibile)。
最简单的路线是probababy将您的控件设置为ReadOnly,将背景设置为System.Drawing.SystemColors.Window然后阻止焦点消息。您可以通过捕获OnEnter事件并立即将Focus移动到另一个非readonly控件(例如,关闭或编辑按钮)来完成此操作。或者您可以派生自己的控件并吃掉任何WM_SETFOCUS消息。示例如下。
我相信各种第三方控件集为您提供了更多选项和粒度。
public class ReadOnlyTextBox : TextBox
{
const uint WM_SETFOCUS = 0x0007;
public ReadOnlyTextBox()
{
this.ReadOnly = true;
this.BackColor = System.Drawing.SystemColors.Window;
this.ForeColor = System.Drawing.SystemColors.WindowText;
}
protected override void WndProc(ref Message m)
{
// eat all setfocus messages, pass rest to base
if (m.Msg != WM_SETFOCUS)
base.WndProc(ref m);
}
}
答案 4 :(得分:0)
我昨天在工作中得到了同样的要求。除了文本框之外,我必须禁用整个表单而不更改它的颜色。
所以我替换了对
的调用form->Enabled = false;
与
IntPtr hWnd = form->Handle;
HWND window_handle = (HWND)hWnd.ToPointer();
::EnableWindow(window_handle, aEnable ? TRUE:FALSE);
哪个效果很好。您可以在上面看到我正在使用托管C ++。整个表单现已禁用,但不会显示为灰色。