如何只读取Windows窗体控件?

时间:2008-11-01 18:54:41

标签: c# .net winforms

经过很长一段时间后回到VS2008中的WinForms ..修补VS2008 Express Edition中的OOD问题。

我需要一些控件才能成为“仅显示”小部件。用户不应该能够更改这些控件的值...小部件由定期更新tick事件更新。我依稀记得有一个ReadOnly属性,你可以设置为有这种行为......现在找不到它。

已启用属性设置为false:灰显控件内容。我希望控件看起来很正常。 已锁定属性设置为false:似乎是在保护用户免于意外扭曲Visual Form Designer中的控件。

我错过了什么?

5 个答案:

答案 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 ++。整个表单现已禁用,但不会显示为灰色。